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