1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker // Weak pointers are pointers to an object that do not affect its lifetime,
6*635a8641SAndroid Build Coastguard Worker // and which may be invalidated (i.e. reset to nullptr) by the object, or its
7*635a8641SAndroid Build Coastguard Worker // owner, at any time, most commonly when the object is about to be deleted.
8*635a8641SAndroid Build Coastguard Worker
9*635a8641SAndroid Build Coastguard Worker // Weak pointers are useful when an object needs to be accessed safely by one
10*635a8641SAndroid Build Coastguard Worker // or more objects other than its owner, and those callers can cope with the
11*635a8641SAndroid Build Coastguard Worker // object vanishing and e.g. tasks posted to it being silently dropped.
12*635a8641SAndroid Build Coastguard Worker // Reference-counting such an object would complicate the ownership graph and
13*635a8641SAndroid Build Coastguard Worker // make it harder to reason about the object's lifetime.
14*635a8641SAndroid Build Coastguard Worker
15*635a8641SAndroid Build Coastguard Worker // EXAMPLE:
16*635a8641SAndroid Build Coastguard Worker //
17*635a8641SAndroid Build Coastguard Worker // class Controller {
18*635a8641SAndroid Build Coastguard Worker // public:
19*635a8641SAndroid Build Coastguard Worker // Controller() : weak_factory_(this) {}
20*635a8641SAndroid Build Coastguard Worker // void SpawnWorker() { Worker::StartNew(weak_factory_.GetWeakPtr()); }
21*635a8641SAndroid Build Coastguard Worker // void WorkComplete(const Result& result) { ... }
22*635a8641SAndroid Build Coastguard Worker // private:
23*635a8641SAndroid Build Coastguard Worker // // Member variables should appear before the WeakPtrFactory, to ensure
24*635a8641SAndroid Build Coastguard Worker // // that any WeakPtrs to Controller are invalidated before its members
25*635a8641SAndroid Build Coastguard Worker // // variable's destructors are executed, rendering them invalid.
26*635a8641SAndroid Build Coastguard Worker // WeakPtrFactory<Controller> weak_factory_;
27*635a8641SAndroid Build Coastguard Worker // };
28*635a8641SAndroid Build Coastguard Worker //
29*635a8641SAndroid Build Coastguard Worker // class Worker {
30*635a8641SAndroid Build Coastguard Worker // public:
31*635a8641SAndroid Build Coastguard Worker // static void StartNew(const WeakPtr<Controller>& controller) {
32*635a8641SAndroid Build Coastguard Worker // Worker* worker = new Worker(controller);
33*635a8641SAndroid Build Coastguard Worker // // Kick off asynchronous processing...
34*635a8641SAndroid Build Coastguard Worker // }
35*635a8641SAndroid Build Coastguard Worker // private:
36*635a8641SAndroid Build Coastguard Worker // Worker(const WeakPtr<Controller>& controller)
37*635a8641SAndroid Build Coastguard Worker // : controller_(controller) {}
38*635a8641SAndroid Build Coastguard Worker // void DidCompleteAsynchronousProcessing(const Result& result) {
39*635a8641SAndroid Build Coastguard Worker // if (controller_)
40*635a8641SAndroid Build Coastguard Worker // controller_->WorkComplete(result);
41*635a8641SAndroid Build Coastguard Worker // }
42*635a8641SAndroid Build Coastguard Worker // WeakPtr<Controller> controller_;
43*635a8641SAndroid Build Coastguard Worker // };
44*635a8641SAndroid Build Coastguard Worker //
45*635a8641SAndroid Build Coastguard Worker // With this implementation a caller may use SpawnWorker() to dispatch multiple
46*635a8641SAndroid Build Coastguard Worker // Workers and subsequently delete the Controller, without waiting for all
47*635a8641SAndroid Build Coastguard Worker // Workers to have completed.
48*635a8641SAndroid Build Coastguard Worker
49*635a8641SAndroid Build Coastguard Worker // ------------------------- IMPORTANT: Thread-safety -------------------------
50*635a8641SAndroid Build Coastguard Worker
51*635a8641SAndroid Build Coastguard Worker // Weak pointers may be passed safely between threads, but must always be
52*635a8641SAndroid Build Coastguard Worker // dereferenced and invalidated on the same SequencedTaskRunner otherwise
53*635a8641SAndroid Build Coastguard Worker // checking the pointer would be racey.
54*635a8641SAndroid Build Coastguard Worker //
55*635a8641SAndroid Build Coastguard Worker // To ensure correct use, the first time a WeakPtr issued by a WeakPtrFactory
56*635a8641SAndroid Build Coastguard Worker // is dereferenced, the factory and its WeakPtrs become bound to the calling
57*635a8641SAndroid Build Coastguard Worker // thread or current SequencedWorkerPool token, and cannot be dereferenced or
58*635a8641SAndroid Build Coastguard Worker // invalidated on any other task runner. Bound WeakPtrs can still be handed
59*635a8641SAndroid Build Coastguard Worker // off to other task runners, e.g. to use to post tasks back to object on the
60*635a8641SAndroid Build Coastguard Worker // bound sequence.
61*635a8641SAndroid Build Coastguard Worker //
62*635a8641SAndroid Build Coastguard Worker // If all WeakPtr objects are destroyed or invalidated then the factory is
63*635a8641SAndroid Build Coastguard Worker // unbound from the SequencedTaskRunner/Thread. The WeakPtrFactory may then be
64*635a8641SAndroid Build Coastguard Worker // destroyed, or new WeakPtr objects may be used, from a different sequence.
65*635a8641SAndroid Build Coastguard Worker //
66*635a8641SAndroid Build Coastguard Worker // Thus, at least one WeakPtr object must exist and have been dereferenced on
67*635a8641SAndroid Build Coastguard Worker // the correct thread to enforce that other WeakPtr objects will enforce they
68*635a8641SAndroid Build Coastguard Worker // are used on the desired thread.
69*635a8641SAndroid Build Coastguard Worker
70*635a8641SAndroid Build Coastguard Worker #ifndef BASE_MEMORY_WEAK_PTR_H_
71*635a8641SAndroid Build Coastguard Worker #define BASE_MEMORY_WEAK_PTR_H_
72*635a8641SAndroid Build Coastguard Worker
73*635a8641SAndroid Build Coastguard Worker #include <cstddef>
74*635a8641SAndroid Build Coastguard Worker #include <type_traits>
75*635a8641SAndroid Build Coastguard Worker
76*635a8641SAndroid Build Coastguard Worker #include "base/base_export.h"
77*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
78*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
79*635a8641SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
80*635a8641SAndroid Build Coastguard Worker #include "base/sequence_checker.h"
81*635a8641SAndroid Build Coastguard Worker
82*635a8641SAndroid Build Coastguard Worker namespace base {
83*635a8641SAndroid Build Coastguard Worker
84*635a8641SAndroid Build Coastguard Worker template <typename T> class SupportsWeakPtr;
85*635a8641SAndroid Build Coastguard Worker template <typename T> class WeakPtr;
86*635a8641SAndroid Build Coastguard Worker
87*635a8641SAndroid Build Coastguard Worker namespace internal {
88*635a8641SAndroid Build Coastguard Worker // These classes are part of the WeakPtr implementation.
89*635a8641SAndroid Build Coastguard Worker // DO NOT USE THESE CLASSES DIRECTLY YOURSELF.
90*635a8641SAndroid Build Coastguard Worker
91*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT WeakReference {
92*635a8641SAndroid Build Coastguard Worker public:
93*635a8641SAndroid Build Coastguard Worker // Although Flag is bound to a specific SequencedTaskRunner, it may be
94*635a8641SAndroid Build Coastguard Worker // deleted from another via base::WeakPtr::~WeakPtr().
95*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT Flag : public RefCountedThreadSafe<Flag> {
96*635a8641SAndroid Build Coastguard Worker public:
97*635a8641SAndroid Build Coastguard Worker Flag();
98*635a8641SAndroid Build Coastguard Worker
99*635a8641SAndroid Build Coastguard Worker void Invalidate();
100*635a8641SAndroid Build Coastguard Worker bool IsValid() const;
101*635a8641SAndroid Build Coastguard Worker
102*635a8641SAndroid Build Coastguard Worker private:
103*635a8641SAndroid Build Coastguard Worker friend class base::RefCountedThreadSafe<Flag>;
104*635a8641SAndroid Build Coastguard Worker
105*635a8641SAndroid Build Coastguard Worker ~Flag();
106*635a8641SAndroid Build Coastguard Worker
107*635a8641SAndroid Build Coastguard Worker SequenceChecker sequence_checker_;
108*635a8641SAndroid Build Coastguard Worker bool is_valid_;
109*635a8641SAndroid Build Coastguard Worker };
110*635a8641SAndroid Build Coastguard Worker
111*635a8641SAndroid Build Coastguard Worker WeakReference();
112*635a8641SAndroid Build Coastguard Worker explicit WeakReference(const scoped_refptr<Flag>& flag);
113*635a8641SAndroid Build Coastguard Worker ~WeakReference();
114*635a8641SAndroid Build Coastguard Worker
115*635a8641SAndroid Build Coastguard Worker WeakReference(WeakReference&& other);
116*635a8641SAndroid Build Coastguard Worker WeakReference(const WeakReference& other);
117*635a8641SAndroid Build Coastguard Worker WeakReference& operator=(WeakReference&& other) = default;
118*635a8641SAndroid Build Coastguard Worker WeakReference& operator=(const WeakReference& other) = default;
119*635a8641SAndroid Build Coastguard Worker
120*635a8641SAndroid Build Coastguard Worker bool is_valid() const;
121*635a8641SAndroid Build Coastguard Worker
122*635a8641SAndroid Build Coastguard Worker private:
123*635a8641SAndroid Build Coastguard Worker scoped_refptr<const Flag> flag_;
124*635a8641SAndroid Build Coastguard Worker };
125*635a8641SAndroid Build Coastguard Worker
126*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT WeakReferenceOwner {
127*635a8641SAndroid Build Coastguard Worker public:
128*635a8641SAndroid Build Coastguard Worker WeakReferenceOwner();
129*635a8641SAndroid Build Coastguard Worker ~WeakReferenceOwner();
130*635a8641SAndroid Build Coastguard Worker
131*635a8641SAndroid Build Coastguard Worker WeakReference GetRef() const;
132*635a8641SAndroid Build Coastguard Worker
HasRefs()133*635a8641SAndroid Build Coastguard Worker bool HasRefs() const { return flag_ && !flag_->HasOneRef(); }
134*635a8641SAndroid Build Coastguard Worker
135*635a8641SAndroid Build Coastguard Worker void Invalidate();
136*635a8641SAndroid Build Coastguard Worker
137*635a8641SAndroid Build Coastguard Worker private:
138*635a8641SAndroid Build Coastguard Worker mutable scoped_refptr<WeakReference::Flag> flag_;
139*635a8641SAndroid Build Coastguard Worker };
140*635a8641SAndroid Build Coastguard Worker
141*635a8641SAndroid Build Coastguard Worker // This class simplifies the implementation of WeakPtr's type conversion
142*635a8641SAndroid Build Coastguard Worker // constructor by avoiding the need for a public accessor for ref_. A
143*635a8641SAndroid Build Coastguard Worker // WeakPtr<T> cannot access the private members of WeakPtr<U>, so this
144*635a8641SAndroid Build Coastguard Worker // base class gives us a way to access ref_ in a protected fashion.
145*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT WeakPtrBase {
146*635a8641SAndroid Build Coastguard Worker public:
147*635a8641SAndroid Build Coastguard Worker WeakPtrBase();
148*635a8641SAndroid Build Coastguard Worker ~WeakPtrBase();
149*635a8641SAndroid Build Coastguard Worker
150*635a8641SAndroid Build Coastguard Worker WeakPtrBase(const WeakPtrBase& other) = default;
151*635a8641SAndroid Build Coastguard Worker WeakPtrBase(WeakPtrBase&& other) = default;
152*635a8641SAndroid Build Coastguard Worker WeakPtrBase& operator=(const WeakPtrBase& other) = default;
153*635a8641SAndroid Build Coastguard Worker WeakPtrBase& operator=(WeakPtrBase&& other) = default;
154*635a8641SAndroid Build Coastguard Worker
reset()155*635a8641SAndroid Build Coastguard Worker void reset() {
156*635a8641SAndroid Build Coastguard Worker ref_ = internal::WeakReference();
157*635a8641SAndroid Build Coastguard Worker ptr_ = 0;
158*635a8641SAndroid Build Coastguard Worker }
159*635a8641SAndroid Build Coastguard Worker
160*635a8641SAndroid Build Coastguard Worker protected:
161*635a8641SAndroid Build Coastguard Worker WeakPtrBase(const WeakReference& ref, uintptr_t ptr);
162*635a8641SAndroid Build Coastguard Worker
163*635a8641SAndroid Build Coastguard Worker WeakReference ref_;
164*635a8641SAndroid Build Coastguard Worker
165*635a8641SAndroid Build Coastguard Worker // This pointer is only valid when ref_.is_valid() is true. Otherwise, its
166*635a8641SAndroid Build Coastguard Worker // value is undefined (as opposed to nullptr).
167*635a8641SAndroid Build Coastguard Worker uintptr_t ptr_;
168*635a8641SAndroid Build Coastguard Worker };
169*635a8641SAndroid Build Coastguard Worker
170*635a8641SAndroid Build Coastguard Worker // This class provides a common implementation of common functions that would
171*635a8641SAndroid Build Coastguard Worker // otherwise get instantiated separately for each distinct instantiation of
172*635a8641SAndroid Build Coastguard Worker // SupportsWeakPtr<>.
173*635a8641SAndroid Build Coastguard Worker class SupportsWeakPtrBase {
174*635a8641SAndroid Build Coastguard Worker public:
175*635a8641SAndroid Build Coastguard Worker // A safe static downcast of a WeakPtr<Base> to WeakPtr<Derived>. This
176*635a8641SAndroid Build Coastguard Worker // conversion will only compile if there is exists a Base which inherits
177*635a8641SAndroid Build Coastguard Worker // from SupportsWeakPtr<Base>. See base::AsWeakPtr() below for a helper
178*635a8641SAndroid Build Coastguard Worker // function that makes calling this easier.
179*635a8641SAndroid Build Coastguard Worker //
180*635a8641SAndroid Build Coastguard Worker // Precondition: t != nullptr
181*635a8641SAndroid Build Coastguard Worker template<typename Derived>
StaticAsWeakPtr(Derived * t)182*635a8641SAndroid Build Coastguard Worker static WeakPtr<Derived> StaticAsWeakPtr(Derived* t) {
183*635a8641SAndroid Build Coastguard Worker static_assert(
184*635a8641SAndroid Build Coastguard Worker std::is_base_of<internal::SupportsWeakPtrBase, Derived>::value,
185*635a8641SAndroid Build Coastguard Worker "AsWeakPtr argument must inherit from SupportsWeakPtr");
186*635a8641SAndroid Build Coastguard Worker return AsWeakPtrImpl<Derived>(t);
187*635a8641SAndroid Build Coastguard Worker }
188*635a8641SAndroid Build Coastguard Worker
189*635a8641SAndroid Build Coastguard Worker private:
190*635a8641SAndroid Build Coastguard Worker // This template function uses type inference to find a Base of Derived
191*635a8641SAndroid Build Coastguard Worker // which is an instance of SupportsWeakPtr<Base>. We can then safely
192*635a8641SAndroid Build Coastguard Worker // static_cast the Base* to a Derived*.
193*635a8641SAndroid Build Coastguard Worker template <typename Derived, typename Base>
AsWeakPtrImpl(SupportsWeakPtr<Base> * t)194*635a8641SAndroid Build Coastguard Worker static WeakPtr<Derived> AsWeakPtrImpl(SupportsWeakPtr<Base>* t) {
195*635a8641SAndroid Build Coastguard Worker WeakPtr<Base> ptr = t->AsWeakPtr();
196*635a8641SAndroid Build Coastguard Worker return WeakPtr<Derived>(
197*635a8641SAndroid Build Coastguard Worker ptr.ref_, static_cast<Derived*>(reinterpret_cast<Base*>(ptr.ptr_)));
198*635a8641SAndroid Build Coastguard Worker }
199*635a8641SAndroid Build Coastguard Worker };
200*635a8641SAndroid Build Coastguard Worker
201*635a8641SAndroid Build Coastguard Worker } // namespace internal
202*635a8641SAndroid Build Coastguard Worker
203*635a8641SAndroid Build Coastguard Worker template <typename T> class WeakPtrFactory;
204*635a8641SAndroid Build Coastguard Worker
205*635a8641SAndroid Build Coastguard Worker // The WeakPtr class holds a weak reference to |T*|.
206*635a8641SAndroid Build Coastguard Worker //
207*635a8641SAndroid Build Coastguard Worker // This class is designed to be used like a normal pointer. You should always
208*635a8641SAndroid Build Coastguard Worker // null-test an object of this class before using it or invoking a method that
209*635a8641SAndroid Build Coastguard Worker // may result in the underlying object being destroyed.
210*635a8641SAndroid Build Coastguard Worker //
211*635a8641SAndroid Build Coastguard Worker // EXAMPLE:
212*635a8641SAndroid Build Coastguard Worker //
213*635a8641SAndroid Build Coastguard Worker // class Foo { ... };
214*635a8641SAndroid Build Coastguard Worker // WeakPtr<Foo> foo;
215*635a8641SAndroid Build Coastguard Worker // if (foo)
216*635a8641SAndroid Build Coastguard Worker // foo->method();
217*635a8641SAndroid Build Coastguard Worker //
218*635a8641SAndroid Build Coastguard Worker template <typename T>
219*635a8641SAndroid Build Coastguard Worker class WeakPtr : public internal::WeakPtrBase {
220*635a8641SAndroid Build Coastguard Worker public:
221*635a8641SAndroid Build Coastguard Worker WeakPtr() = default;
222*635a8641SAndroid Build Coastguard Worker
WeakPtr(std::nullptr_t)223*635a8641SAndroid Build Coastguard Worker WeakPtr(std::nullptr_t) {}
224*635a8641SAndroid Build Coastguard Worker
225*635a8641SAndroid Build Coastguard Worker // Allow conversion from U to T provided U "is a" T. Note that this
226*635a8641SAndroid Build Coastguard Worker // is separate from the (implicit) copy and move constructors.
227*635a8641SAndroid Build Coastguard Worker template <typename U>
WeakPtr(const WeakPtr<U> & other)228*635a8641SAndroid Build Coastguard Worker WeakPtr(const WeakPtr<U>& other) : WeakPtrBase(other) {
229*635a8641SAndroid Build Coastguard Worker // Need to cast from U* to T* to do pointer adjustment in case of multiple
230*635a8641SAndroid Build Coastguard Worker // inheritance. This also enforces the "U is a T" rule.
231*635a8641SAndroid Build Coastguard Worker T* t = reinterpret_cast<U*>(other.ptr_);
232*635a8641SAndroid Build Coastguard Worker ptr_ = reinterpret_cast<uintptr_t>(t);
233*635a8641SAndroid Build Coastguard Worker }
234*635a8641SAndroid Build Coastguard Worker template <typename U>
WeakPtr(WeakPtr<U> && other)235*635a8641SAndroid Build Coastguard Worker WeakPtr(WeakPtr<U>&& other) : WeakPtrBase(std::move(other)) {
236*635a8641SAndroid Build Coastguard Worker // Need to cast from U* to T* to do pointer adjustment in case of multiple
237*635a8641SAndroid Build Coastguard Worker // inheritance. This also enforces the "U is a T" rule.
238*635a8641SAndroid Build Coastguard Worker T* t = reinterpret_cast<U*>(other.ptr_);
239*635a8641SAndroid Build Coastguard Worker ptr_ = reinterpret_cast<uintptr_t>(t);
240*635a8641SAndroid Build Coastguard Worker }
241*635a8641SAndroid Build Coastguard Worker
get()242*635a8641SAndroid Build Coastguard Worker T* get() const {
243*635a8641SAndroid Build Coastguard Worker return ref_.is_valid() ? reinterpret_cast<T*>(ptr_) : nullptr;
244*635a8641SAndroid Build Coastguard Worker }
245*635a8641SAndroid Build Coastguard Worker
246*635a8641SAndroid Build Coastguard Worker T& operator*() const {
247*635a8641SAndroid Build Coastguard Worker DCHECK(get() != nullptr);
248*635a8641SAndroid Build Coastguard Worker return *get();
249*635a8641SAndroid Build Coastguard Worker }
250*635a8641SAndroid Build Coastguard Worker T* operator->() const {
251*635a8641SAndroid Build Coastguard Worker DCHECK(get() != nullptr);
252*635a8641SAndroid Build Coastguard Worker return get();
253*635a8641SAndroid Build Coastguard Worker }
254*635a8641SAndroid Build Coastguard Worker
255*635a8641SAndroid Build Coastguard Worker // Allow conditionals to test validity, e.g. if (weak_ptr) {...};
256*635a8641SAndroid Build Coastguard Worker explicit operator bool() const { return get() != nullptr; }
257*635a8641SAndroid Build Coastguard Worker
258*635a8641SAndroid Build Coastguard Worker private:
259*635a8641SAndroid Build Coastguard Worker friend class internal::SupportsWeakPtrBase;
260*635a8641SAndroid Build Coastguard Worker template <typename U> friend class WeakPtr;
261*635a8641SAndroid Build Coastguard Worker friend class SupportsWeakPtr<T>;
262*635a8641SAndroid Build Coastguard Worker friend class WeakPtrFactory<T>;
263*635a8641SAndroid Build Coastguard Worker
WeakPtr(const internal::WeakReference & ref,T * ptr)264*635a8641SAndroid Build Coastguard Worker WeakPtr(const internal::WeakReference& ref, T* ptr)
265*635a8641SAndroid Build Coastguard Worker : WeakPtrBase(ref, reinterpret_cast<uintptr_t>(ptr)) {}
266*635a8641SAndroid Build Coastguard Worker };
267*635a8641SAndroid Build Coastguard Worker
268*635a8641SAndroid Build Coastguard Worker // Allow callers to compare WeakPtrs against nullptr to test validity.
269*635a8641SAndroid Build Coastguard Worker template <class T>
270*635a8641SAndroid Build Coastguard Worker bool operator!=(const WeakPtr<T>& weak_ptr, std::nullptr_t) {
271*635a8641SAndroid Build Coastguard Worker return !(weak_ptr == nullptr);
272*635a8641SAndroid Build Coastguard Worker }
273*635a8641SAndroid Build Coastguard Worker template <class T>
274*635a8641SAndroid Build Coastguard Worker bool operator!=(std::nullptr_t, const WeakPtr<T>& weak_ptr) {
275*635a8641SAndroid Build Coastguard Worker return weak_ptr != nullptr;
276*635a8641SAndroid Build Coastguard Worker }
277*635a8641SAndroid Build Coastguard Worker template <class T>
278*635a8641SAndroid Build Coastguard Worker bool operator==(const WeakPtr<T>& weak_ptr, std::nullptr_t) {
279*635a8641SAndroid Build Coastguard Worker return weak_ptr.get() == nullptr;
280*635a8641SAndroid Build Coastguard Worker }
281*635a8641SAndroid Build Coastguard Worker template <class T>
282*635a8641SAndroid Build Coastguard Worker bool operator==(std::nullptr_t, const WeakPtr<T>& weak_ptr) {
283*635a8641SAndroid Build Coastguard Worker return weak_ptr == nullptr;
284*635a8641SAndroid Build Coastguard Worker }
285*635a8641SAndroid Build Coastguard Worker
286*635a8641SAndroid Build Coastguard Worker namespace internal {
287*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT WeakPtrFactoryBase {
288*635a8641SAndroid Build Coastguard Worker protected:
289*635a8641SAndroid Build Coastguard Worker WeakPtrFactoryBase(uintptr_t ptr);
290*635a8641SAndroid Build Coastguard Worker ~WeakPtrFactoryBase();
291*635a8641SAndroid Build Coastguard Worker internal::WeakReferenceOwner weak_reference_owner_;
292*635a8641SAndroid Build Coastguard Worker uintptr_t ptr_;
293*635a8641SAndroid Build Coastguard Worker };
294*635a8641SAndroid Build Coastguard Worker } // namespace internal
295*635a8641SAndroid Build Coastguard Worker
296*635a8641SAndroid Build Coastguard Worker // A class may be composed of a WeakPtrFactory and thereby
297*635a8641SAndroid Build Coastguard Worker // control how it exposes weak pointers to itself. This is helpful if you only
298*635a8641SAndroid Build Coastguard Worker // need weak pointers within the implementation of a class. This class is also
299*635a8641SAndroid Build Coastguard Worker // useful when working with primitive types. For example, you could have a
300*635a8641SAndroid Build Coastguard Worker // WeakPtrFactory<bool> that is used to pass around a weak reference to a bool.
301*635a8641SAndroid Build Coastguard Worker template <class T>
302*635a8641SAndroid Build Coastguard Worker class WeakPtrFactory : public internal::WeakPtrFactoryBase {
303*635a8641SAndroid Build Coastguard Worker public:
WeakPtrFactory(T * ptr)304*635a8641SAndroid Build Coastguard Worker explicit WeakPtrFactory(T* ptr)
305*635a8641SAndroid Build Coastguard Worker : WeakPtrFactoryBase(reinterpret_cast<uintptr_t>(ptr)) {}
306*635a8641SAndroid Build Coastguard Worker
307*635a8641SAndroid Build Coastguard Worker ~WeakPtrFactory() = default;
308*635a8641SAndroid Build Coastguard Worker
GetWeakPtr()309*635a8641SAndroid Build Coastguard Worker WeakPtr<T> GetWeakPtr() {
310*635a8641SAndroid Build Coastguard Worker return WeakPtr<T>(weak_reference_owner_.GetRef(),
311*635a8641SAndroid Build Coastguard Worker reinterpret_cast<T*>(ptr_));
312*635a8641SAndroid Build Coastguard Worker }
313*635a8641SAndroid Build Coastguard Worker
314*635a8641SAndroid Build Coastguard Worker // Call this method to invalidate all existing weak pointers.
InvalidateWeakPtrs()315*635a8641SAndroid Build Coastguard Worker void InvalidateWeakPtrs() {
316*635a8641SAndroid Build Coastguard Worker DCHECK(ptr_);
317*635a8641SAndroid Build Coastguard Worker weak_reference_owner_.Invalidate();
318*635a8641SAndroid Build Coastguard Worker }
319*635a8641SAndroid Build Coastguard Worker
320*635a8641SAndroid Build Coastguard Worker // Call this method to determine if any weak pointers exist.
HasWeakPtrs()321*635a8641SAndroid Build Coastguard Worker bool HasWeakPtrs() const {
322*635a8641SAndroid Build Coastguard Worker DCHECK(ptr_);
323*635a8641SAndroid Build Coastguard Worker return weak_reference_owner_.HasRefs();
324*635a8641SAndroid Build Coastguard Worker }
325*635a8641SAndroid Build Coastguard Worker
326*635a8641SAndroid Build Coastguard Worker private:
327*635a8641SAndroid Build Coastguard Worker DISALLOW_IMPLICIT_CONSTRUCTORS(WeakPtrFactory);
328*635a8641SAndroid Build Coastguard Worker };
329*635a8641SAndroid Build Coastguard Worker
330*635a8641SAndroid Build Coastguard Worker // A class may extend from SupportsWeakPtr to let others take weak pointers to
331*635a8641SAndroid Build Coastguard Worker // it. This avoids the class itself implementing boilerplate to dispense weak
332*635a8641SAndroid Build Coastguard Worker // pointers. However, since SupportsWeakPtr's destructor won't invalidate
333*635a8641SAndroid Build Coastguard Worker // weak pointers to the class until after the derived class' members have been
334*635a8641SAndroid Build Coastguard Worker // destroyed, its use can lead to subtle use-after-destroy issues.
335*635a8641SAndroid Build Coastguard Worker template <class T>
336*635a8641SAndroid Build Coastguard Worker class SupportsWeakPtr : public internal::SupportsWeakPtrBase {
337*635a8641SAndroid Build Coastguard Worker public:
338*635a8641SAndroid Build Coastguard Worker SupportsWeakPtr() = default;
339*635a8641SAndroid Build Coastguard Worker
AsWeakPtr()340*635a8641SAndroid Build Coastguard Worker WeakPtr<T> AsWeakPtr() {
341*635a8641SAndroid Build Coastguard Worker return WeakPtr<T>(weak_reference_owner_.GetRef(), static_cast<T*>(this));
342*635a8641SAndroid Build Coastguard Worker }
343*635a8641SAndroid Build Coastguard Worker
344*635a8641SAndroid Build Coastguard Worker protected:
345*635a8641SAndroid Build Coastguard Worker ~SupportsWeakPtr() = default;
346*635a8641SAndroid Build Coastguard Worker
347*635a8641SAndroid Build Coastguard Worker private:
348*635a8641SAndroid Build Coastguard Worker internal::WeakReferenceOwner weak_reference_owner_;
349*635a8641SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(SupportsWeakPtr);
350*635a8641SAndroid Build Coastguard Worker };
351*635a8641SAndroid Build Coastguard Worker
352*635a8641SAndroid Build Coastguard Worker // Helper function that uses type deduction to safely return a WeakPtr<Derived>
353*635a8641SAndroid Build Coastguard Worker // when Derived doesn't directly extend SupportsWeakPtr<Derived>, instead it
354*635a8641SAndroid Build Coastguard Worker // extends a Base that extends SupportsWeakPtr<Base>.
355*635a8641SAndroid Build Coastguard Worker //
356*635a8641SAndroid Build Coastguard Worker // EXAMPLE:
357*635a8641SAndroid Build Coastguard Worker // class Base : public base::SupportsWeakPtr<Producer> {};
358*635a8641SAndroid Build Coastguard Worker // class Derived : public Base {};
359*635a8641SAndroid Build Coastguard Worker //
360*635a8641SAndroid Build Coastguard Worker // Derived derived;
361*635a8641SAndroid Build Coastguard Worker // base::WeakPtr<Derived> ptr = base::AsWeakPtr(&derived);
362*635a8641SAndroid Build Coastguard Worker //
363*635a8641SAndroid Build Coastguard Worker // Note that the following doesn't work (invalid type conversion) since
364*635a8641SAndroid Build Coastguard Worker // Derived::AsWeakPtr() is WeakPtr<Base> SupportsWeakPtr<Base>::AsWeakPtr(),
365*635a8641SAndroid Build Coastguard Worker // and there's no way to safely cast WeakPtr<Base> to WeakPtr<Derived> at
366*635a8641SAndroid Build Coastguard Worker // the caller.
367*635a8641SAndroid Build Coastguard Worker //
368*635a8641SAndroid Build Coastguard Worker // base::WeakPtr<Derived> ptr = derived.AsWeakPtr(); // Fails.
369*635a8641SAndroid Build Coastguard Worker
370*635a8641SAndroid Build Coastguard Worker template <typename Derived>
AsWeakPtr(Derived * t)371*635a8641SAndroid Build Coastguard Worker WeakPtr<Derived> AsWeakPtr(Derived* t) {
372*635a8641SAndroid Build Coastguard Worker return internal::SupportsWeakPtrBase::StaticAsWeakPtr<Derived>(t);
373*635a8641SAndroid Build Coastguard Worker }
374*635a8641SAndroid Build Coastguard Worker
375*635a8641SAndroid Build Coastguard Worker } // namespace base
376*635a8641SAndroid Build Coastguard Worker
377*635a8641SAndroid Build Coastguard Worker #endif // BASE_MEMORY_WEAK_PTR_H_
378