| Index: base/memory/weak_ptr.h
|
| diff --git a/base/memory/weak_ptr.h b/base/memory/weak_ptr.h
|
| index 19def01eb70f1c1a8ece45b7096e8475c74ad342..8c2220fa501909043233e5cd8dc71e2977b8918b 100644
|
| --- a/base/memory/weak_ptr.h
|
| +++ b/base/memory/weak_ptr.h
|
| @@ -19,6 +19,9 @@
|
| // 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_;
|
| // };
|
| //
|
| @@ -44,17 +47,18 @@
|
|
|
| // ------------------------- IMPORTANT: Thread-safety -------------------------
|
|
|
| -// Weak pointers must always be dereferenced and invalidated on the same thread
|
| -// otherwise checking the pointer would be racey. WeakPtrFactory enforces this
|
| -// by binding itself to the current thread when a WeakPtr is first created
|
| -// and un-binding only when those pointers are invalidated. WeakPtrs may still
|
| -// be handed off to other threads, however, so long as they are only actually
|
| -// dereferenced on the originating thread. This includes posting tasks to the
|
| -// thread using base::Bind() to invoke a method on the object via the WeakPtr.
|
| -
|
| -// Calling SupportsWeakPtr::DetachFromThread() can work around the limitations
|
| -// above and cancel the thread binding of the object and all WeakPtrs pointing
|
| -// to it, but it's not recommended and unsafe. See crbug.com/232143.
|
| +// Weak pointers may be passed safely between threads, but must always be
|
| +// dereferenced and invalidated on the same 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
|
| +// thread, and cannot be dereferenced or invalidated on any other thread. Bound
|
| +// WeakPtrs can still be handed off to other threads, e.g. to use to post tasks
|
| +// back to object on the bound thread.
|
| +//
|
| +// Invalidating the factory's WeakPtrs un-binds it from the thread, allowing it
|
| +// to be passed for a different thread to use or delete it.
|
|
|
| #ifndef BASE_MEMORY_WEAK_PTR_H_
|
| #define BASE_MEMORY_WEAK_PTR_H_
|
| @@ -77,7 +81,7 @@ namespace internal {
|
|
|
| class BASE_EXPORT WeakReference {
|
| public:
|
| - // While Flag is bound to a specific thread, it may be deleted from another
|
| + // Although Flag is bound to a specific thread, it may be deleted from another
|
| // via base::WeakPtr::~WeakPtr().
|
| class Flag : public RefCountedThreadSafe<Flag> {
|
| public:
|
| @@ -86,7 +90,8 @@ class BASE_EXPORT WeakReference {
|
| void Invalidate();
|
| bool IsValid() const;
|
|
|
| - void DetachFromThread() { thread_checker_.DetachFromThread(); }
|
| + // Remove this when crbug.com/234964 is addressed.
|
| + void DetachFromThreadHack() { thread_checker_.DetachFromThread(); }
|
|
|
| private:
|
| friend class base::RefCountedThreadSafe<Flag>;
|
| @@ -120,10 +125,9 @@ class BASE_EXPORT WeakReferenceOwner {
|
|
|
| void Invalidate();
|
|
|
| - // Indicates that this object will be used on another thread from now on.
|
| - // Do not use this in new code. See crbug.com/232143.
|
| - void DetachFromThread() {
|
| - if (flag_) flag_->DetachFromThread();
|
| + // Remove this when crbug.com/234964 is addressed.
|
| + void DetachFromThreadHack() {
|
| + if (flag_) flag_->DetachFromThreadHack();
|
| }
|
|
|
| private:
|
| @@ -269,13 +273,6 @@ class WeakPtrFactory {
|
| return weak_reference_owner_.HasRefs();
|
| }
|
|
|
| - // Indicates that this object will be used on another thread from now on.
|
| - // Do not use this in new code. See crbug.com/232143.
|
| - void DetachFromThread() {
|
| - DCHECK(ptr_);
|
| - weak_reference_owner_.DetachFromThread();
|
| - }
|
| -
|
| private:
|
| internal::WeakReferenceOwner weak_reference_owner_;
|
| T* ptr_;
|
| @@ -296,10 +293,12 @@ class SupportsWeakPtr : public internal::SupportsWeakPtrBase {
|
| return WeakPtr<T>(weak_reference_owner_.GetRef(), static_cast<T*>(this));
|
| }
|
|
|
| - // Indicates that this object will be used on another thread from now on.
|
| - // Do not use this in new code. See crbug.com/232143.
|
| - void DetachFromThread() {
|
| - weak_reference_owner_.DetachFromThread();
|
| + // Removes the binding, if any, from this object to a particular thread.
|
| + // This is used in WebGraphicsContext3DInProcessCommandBufferImpl to work-
|
| + // around access to cmmand buffer objects by more than one thread.
|
| + // Remove this when crbug.com/234964 is addressed.
|
| + void DetachFromThreadHack() {
|
| + weak_reference_owner_.DetachFromThreadHack();
|
| }
|
|
|
| protected:
|
|
|