1 /* 2 * Copyright 2016 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 #ifndef RTC_BASE_REF_COUNTED_OBJECT_H_ 11 #define RTC_BASE_REF_COUNTED_OBJECT_H_ 12 13 #include <type_traits> 14 #include <utility> 15 16 #include "rtc_base/constructor_magic.h" 17 #include "rtc_base/ref_count.h" 18 #include "rtc_base/ref_counter.h" 19 20 namespace rtc { 21 22 template <class T> 23 class RefCountedObject : public T { 24 public: RefCountedObject()25 RefCountedObject() {} 26 27 template <class P0> RefCountedObject(P0 && p0)28 explicit RefCountedObject(P0&& p0) : T(std::forward<P0>(p0)) {} 29 30 template <class P0, class P1, class... Args> RefCountedObject(P0 && p0,P1 && p1,Args &&...args)31 RefCountedObject(P0&& p0, P1&& p1, Args&&... args) 32 : T(std::forward<P0>(p0), 33 std::forward<P1>(p1), 34 std::forward<Args>(args)...) {} 35 AddRef()36 virtual void AddRef() const { ref_count_.IncRef(); } 37 Release()38 virtual RefCountReleaseStatus Release() const { 39 const auto status = ref_count_.DecRef(); 40 if (status == RefCountReleaseStatus::kDroppedLastRef) { 41 delete this; 42 } 43 return status; 44 } 45 46 // Return whether the reference count is one. If the reference count is used 47 // in the conventional way, a reference count of 1 implies that the current 48 // thread owns the reference and no other thread shares it. This call 49 // performs the test for a reference count of one, and performs the memory 50 // barrier needed for the owning thread to act on the object, knowing that it 51 // has exclusive access to the object. HasOneRef()52 virtual bool HasOneRef() const { return ref_count_.HasOneRef(); } 53 54 protected: ~RefCountedObject()55 virtual ~RefCountedObject() {} 56 57 mutable webrtc::webrtc_impl::RefCounter ref_count_{0}; 58 59 RTC_DISALLOW_COPY_AND_ASSIGN(RefCountedObject); 60 }; 61 62 } // namespace rtc 63 64 #endif // RTC_BASE_REF_COUNTED_OBJECT_H_ 65