Index: webrtc/base/weak_ptr.h |
diff --git a/webrtc/base/weak_ptr.h b/webrtc/base/weak_ptr.h |
index 28789d014b07a5ac0d41c2aa8e114f8038081f39..282a5516287457021e82c50d35f7279079ba9203 100644 |
--- a/webrtc/base/weak_ptr.h |
+++ b/webrtc/base/weak_ptr.h |
@@ -11,262 +11,9 @@ |
#ifndef WEBRTC_BASE_WEAK_PTR_H_ |
#define WEBRTC_BASE_WEAK_PTR_H_ |
-#include <memory> |
-#include <utility> |
- |
-#include "webrtc/base/refcount.h" |
-#include "webrtc/base/scoped_ref_ptr.h" |
-#include "webrtc/base/sequenced_task_checker.h" |
- |
-// The implementation is borrowed from chromium except that it does not |
-// implement SupportsWeakPtr. |
- |
-// Weak pointers are pointers to an object that do not affect its lifetime, |
-// and which may be invalidated (i.e. reset to nullptr) by the object, or its |
-// owner, at any time, most commonly when the object is about to be deleted. |
- |
-// Weak pointers are useful when an object needs to be accessed safely by one |
-// or more objects other than its owner, and those callers can cope with the |
-// object vanishing and e.g. tasks posted to it being silently dropped. |
-// Reference-counting such an object would complicate the ownership graph and |
-// make it harder to reason about the object's lifetime. |
- |
-// EXAMPLE: |
-// |
-// class Controller { |
-// public: |
-// Controller() : weak_factory_(this) {} |
-// void SpawnWorker() { Worker::StartNew(weak_factory_.GetWeakPtr()); } |
-// void WorkComplete(const Result& result) { ... } |
-// private: |
-// // Member variables should appear before the WeakPtrFactory, to ensure |
-// // that any WeakPtrs to Controller are invalidated before its members |
-// // variable's destructors are executed, rendering them invalid. |
-// WeakPtrFactory<Controller> weak_factory_; |
-// }; |
-// |
-// class Worker { |
-// public: |
-// static void StartNew(const WeakPtr<Controller>& controller) { |
-// Worker* worker = new Worker(controller); |
-// // Kick off asynchronous processing... |
-// } |
-// private: |
-// Worker(const WeakPtr<Controller>& controller) |
-// : controller_(controller) {} |
-// void DidCompleteAsynchronousProcessing(const Result& result) { |
-// if (controller_) |
-// controller_->WorkComplete(result); |
-// } |
-// WeakPtr<Controller> controller_; |
-// }; |
-// |
-// With this implementation a caller may use SpawnWorker() to dispatch multiple |
-// Workers and subsequently delete the Controller, without waiting for all |
-// Workers to have completed. |
- |
-// ------------------------- IMPORTANT: Thread-safety ------------------------- |
- |
-// Weak pointers may be passed safely between threads, but must always be |
-// dereferenced and invalidated on the same TaskQueue or thread, otherwise |
-// checking the pointer would be racey. |
-// |
-// To ensure correct use, the first time a WeakPtr issued by a WeakPtrFactory |
-// is dereferenced, the factory and its WeakPtrs become bound to the calling |
-// TaskQueue/thread, and cannot be dereferenced or |
-// invalidated on any other TaskQueue/thread. Bound WeakPtrs can still be handed |
-// off to other TaskQueues, e.g. to use to post tasks back to object on the |
-// bound sequence. |
-// |
-// Thus, at least one WeakPtr object must exist and have been dereferenced on |
-// the correct thread to enforce that other WeakPtr objects will enforce they |
-// are used on the desired thread. |
- |
-namespace rtc { |
- |
-namespace internal { |
- |
-class WeakReference { |
- public: |
- // Although Flag is bound to a specific sequence, it may be |
- // deleted from another via base::WeakPtr::~WeakPtr(). |
- class Flag : public RefCountInterface { |
- public: |
- Flag(); |
- |
- void Invalidate(); |
- bool IsValid() const; |
- |
- private: |
- friend class RefCountedObject<Flag>; |
- |
- ~Flag() override; |
- |
- SequencedTaskChecker checker_; |
- bool is_valid_; |
- }; |
- |
- WeakReference(); |
- explicit WeakReference(const Flag* flag); |
- ~WeakReference(); |
- |
- WeakReference(WeakReference&& other); |
- WeakReference(const WeakReference& other); |
- WeakReference& operator=(WeakReference&& other) = default; |
- WeakReference& operator=(const WeakReference& other) = default; |
- |
- bool is_valid() const; |
- |
- private: |
- scoped_refptr<const Flag> flag_; |
-}; |
- |
-class WeakReferenceOwner { |
- public: |
- WeakReferenceOwner(); |
- ~WeakReferenceOwner(); |
- |
- WeakReference GetRef() const; |
- |
- bool HasRefs() const { return flag_.get() && !flag_->HasOneRef(); } |
- |
- void Invalidate(); |
- |
- private: |
- SequencedTaskChecker checker_; |
- mutable scoped_refptr<RefCountedObject<WeakReference::Flag>> flag_; |
-}; |
- |
-// This class simplifies the implementation of WeakPtr's type conversion |
-// constructor by avoiding the need for a public accessor for ref_. A |
-// WeakPtr<T> cannot access the private members of WeakPtr<U>, so this |
-// base class gives us a way to access ref_ in a protected fashion. |
-class WeakPtrBase { |
- public: |
- WeakPtrBase(); |
- ~WeakPtrBase(); |
- |
- WeakPtrBase(const WeakPtrBase& other) = default; |
- WeakPtrBase(WeakPtrBase&& other) = default; |
- WeakPtrBase& operator=(const WeakPtrBase& other) = default; |
- WeakPtrBase& operator=(WeakPtrBase&& other) = default; |
- |
- protected: |
- explicit WeakPtrBase(const WeakReference& ref); |
- |
- WeakReference ref_; |
-}; |
- |
-} // namespace internal |
- |
-template <typename T> |
-class WeakPtrFactory; |
- |
-template <typename T> |
-class WeakPtr : public internal::WeakPtrBase { |
- public: |
- WeakPtr() : ptr_(nullptr) {} |
- |
- // Allow conversion from U to T provided U "is a" T. Note that this |
- // is separate from the (implicit) copy and move constructors. |
- template <typename U> |
- WeakPtr(const WeakPtr<U>& other) |
- : internal::WeakPtrBase(other), ptr_(other.ptr_) {} |
- template <typename U> |
- WeakPtr(WeakPtr<U>&& other) |
- : internal::WeakPtrBase(std::move(other)), ptr_(other.ptr_) {} |
- |
- T* get() const { return ref_.is_valid() ? ptr_ : nullptr; } |
- |
- T& operator*() const { |
- RTC_DCHECK(get() != nullptr); |
- return *get(); |
- } |
- T* operator->() const { |
- RTC_DCHECK(get() != nullptr); |
- return get(); |
- } |
- |
- void reset() { |
- ref_ = internal::WeakReference(); |
- ptr_ = nullptr; |
- } |
- |
- // Allow conditionals to test validity, e.g. if (weak_ptr) {...}; |
- explicit operator bool() const { return get() != nullptr; } |
- |
- private: |
- template <typename U> |
- friend class WeakPtr; |
- friend class WeakPtrFactory<T>; |
- |
- WeakPtr(const internal::WeakReference& ref, T* ptr) |
- : internal::WeakPtrBase(ref), ptr_(ptr) {} |
- |
- // This pointer is only valid when ref_.is_valid() is true. Otherwise, its |
- // value is undefined (as opposed to nullptr). |
- T* ptr_; |
-}; |
- |
-// Allow callers to compare WeakPtrs against nullptr to test validity. |
-template <class T> |
-bool operator!=(const WeakPtr<T>& weak_ptr, std::nullptr_t) { |
- return !(weak_ptr == nullptr); |
-} |
-template <class T> |
-bool operator!=(std::nullptr_t, const WeakPtr<T>& weak_ptr) { |
- return weak_ptr != nullptr; |
-} |
-template <class T> |
-bool operator==(const WeakPtr<T>& weak_ptr, std::nullptr_t) { |
- return weak_ptr.get() == nullptr; |
-} |
-template <class T> |
-bool operator==(std::nullptr_t, const WeakPtr<T>& weak_ptr) { |
- return weak_ptr == nullptr; |
-} |
- |
-// A class may be composed of a WeakPtrFactory and thereby |
-// control how it exposes weak pointers to itself. This is helpful if you only |
-// need weak pointers within the implementation of a class. This class is also |
-// useful when working with primitive types. For example, you could have a |
-// WeakPtrFactory<bool> that is used to pass around a weak reference to a bool. |
- |
-// Note that GetWeakPtr must be called on one and only one TaskQueue or thread |
-// and the WeakPtr must only be dereferenced and invalidated on that same |
-// TaskQueue/thread. A WeakPtr instance can be copied and posted to other |
-// sequences though as long as it is not dereferenced (WeakPtr<T>::get()). |
-template <class T> |
-class WeakPtrFactory { |
- public: |
- explicit WeakPtrFactory(T* ptr) : ptr_(ptr) {} |
- |
- ~WeakPtrFactory() { ptr_ = nullptr; } |
- |
- WeakPtr<T> GetWeakPtr() { |
- RTC_DCHECK(ptr_); |
- return WeakPtr<T>(weak_reference_owner_.GetRef(), ptr_); |
- } |
- |
- // Call this method to invalidate all existing weak pointers. |
- void InvalidateWeakPtrs() { |
- RTC_DCHECK(ptr_); |
- weak_reference_owner_.Invalidate(); |
- } |
- |
- // Call this method to determine if any weak pointers exist. |
- bool HasWeakPtrs() const { |
- RTC_DCHECK(ptr_); |
- return weak_reference_owner_.HasRefs(); |
- } |
- |
- private: |
- internal::WeakReferenceOwner weak_reference_owner_; |
- T* ptr_; |
- RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WeakPtrFactory); |
-}; |
- |
-} // namespace rtc |
+// This header is deprecated and is just left here temporarily during |
+// refactoring. See https://bugs.webrtc.org/7634 for more details. |
+#include "webrtc/rtc_base/weak_ptr.h" |
#endif // WEBRTC_BASE_WEAK_PTR_H_ |