OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Weak pointers help in cases where you have many objects referring back to a | 5 // Weak pointers help in cases where you have many objects referring back to a |
6 // shared object and you wish for the lifetime of the shared object to not be | 6 // shared object and you wish for the lifetime of the shared object to not be |
7 // bound to the lifetime of the referrers. In other words, this is useful when | 7 // bound to the lifetime of the referrers. In other words, this is useful when |
8 // reference counting is not a good fit. | 8 // reference counting is not a good fit. |
9 // | 9 // |
10 // Thread-safety notes: | 10 // Thread-safety notes: |
11 // When you get a WeakPtr (from a WeakPtrFactory or SupportsWeakPtr), | 11 // When you get a WeakPtr (from a WeakPtrFactory or SupportsWeakPtr), the |
12 // the WeakPtr becomes bound to the current thread. You may only | 12 // WeakPtr becomes bound to the current thread. You may only dereference the |
13 // dereference the WeakPtr on that thread. However, it is safe to | 13 // WeakPtr on that thread. However, it is safe to destroy the WeakPtr object |
14 // destroy the WeakPtr object on another thread. | 14 // on another thread. Since a WeakPtr object may be destroyed on a background |
15 // Since a WeakPtr object may be destroyed on a background thread, | 15 // thread, querying WeakPtrFactory's HasWeakPtrs() method can be racy. |
16 // querying WeakPtrFactory's HasWeakPtrs() method can be racy. | 16 // On the other hand, the object that supports WeakPtr (extends |
17 // | 17 // SupportsWeakPtr) will be bound to the first thread that creates a WeakPtr |
18 // pointing to it, and can not be deleted from other threads unless all | |
19 // WeakPtrs are deleted. To work around of this, call | |
Ryan Sleevi
2012/07/10 00:06:44
nit: To work around this
kaiwang
2012/07/10 22:21:19
Done.
| |
20 // SupportsWeakPtr::DetachFromThread(). | |
Ryan Sleevi
2012/07/10 00:06:44
I'm not sure we should encourage calling DetachFro
kaiwang
2012/07/10 22:21:19
Changed the wording.
| |
18 // | 21 // |
19 // A common alternative to weak pointers is to have the shared object hold a | 22 // A common alternative to weak pointers is to have the shared object hold a |
20 // list of all referrers, and then when the shared object is destroyed, it | 23 // list of all referrers, and then when the shared object is destroyed, it |
21 // calls a method on the referrers to tell them to drop their references. This | 24 // calls a method on the referrers to tell them to drop their references. This |
22 // approach also requires the referrers to tell the shared object when they get | 25 // approach also requires the referrers to tell the shared object when they get |
23 // destroyed so that the shared object can remove the referrer from its list of | 26 // destroyed so that the shared object can remove the referrer from its list of |
24 // referrers. Such a solution works, but it is a bit complex. | 27 // referrers. Such a solution works, but it is a bit complex. |
25 // | 28 // |
26 // EXAMPLE: | 29 // EXAMPLE: |
27 // | 30 // |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
218 ref_ = internal::WeakReference(); | 221 ref_ = internal::WeakReference(); |
219 ptr_ = NULL; | 222 ptr_ = NULL; |
220 } | 223 } |
221 | 224 |
222 private: | 225 private: |
223 friend class internal::SupportsWeakPtrBase; | 226 friend class internal::SupportsWeakPtrBase; |
224 friend class SupportsWeakPtr<T>; | 227 friend class SupportsWeakPtr<T>; |
225 friend class WeakPtrFactory<T>; | 228 friend class WeakPtrFactory<T>; |
226 | 229 |
227 WeakPtr(const internal::WeakReference& ref, T* ptr) | 230 WeakPtr(const internal::WeakReference& ref, T* ptr) |
228 : WeakPtrBase(ref), ptr_(ptr) { | 231 : WeakPtrBase(ref), |
232 ptr_(ptr) { | |
229 } | 233 } |
230 | 234 |
231 // This pointer is only valid when ref_.is_valid() is true. Otherwise, its | 235 // This pointer is only valid when ref_.is_valid() is true. Otherwise, its |
232 // value is undefined (as opposed to NULL). | 236 // value is undefined (as opposed to NULL). |
233 T* ptr_; | 237 T* ptr_; |
234 }; | 238 }; |
235 | 239 |
236 // A class may extend from SupportsWeakPtr to expose weak pointers to itself. | 240 // A class may extend from SupportsWeakPtr to expose weak pointers to itself. |
237 // This is useful in cases where you want others to be able to get a weak | 241 // This is useful in cases where you want others to be able to get a weak |
238 // pointer to your class. It also has the property that you don't need to | 242 // pointer to your class. It also has the property that you don't need to |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
322 | 326 |
323 private: | 327 private: |
324 internal::WeakReferenceOwner weak_reference_owner_; | 328 internal::WeakReferenceOwner weak_reference_owner_; |
325 T* ptr_; | 329 T* ptr_; |
326 DISALLOW_IMPLICIT_CONSTRUCTORS(WeakPtrFactory); | 330 DISALLOW_IMPLICIT_CONSTRUCTORS(WeakPtrFactory); |
327 }; | 331 }; |
328 | 332 |
329 } // namespace base | 333 } // namespace base |
330 | 334 |
331 #endif // BASE_MEMORY_WEAK_PTR_H_ | 335 #endif // BASE_MEMORY_WEAK_PTR_H_ |
OLD | NEW |