diff options
author | erg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-11 20:13:46 +0000 |
---|---|---|
committer | erg@google.com <erg@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-11 20:13:46 +0000 |
commit | f5027e47691dc2fe5ad4d3ff588b2f46533eca1c (patch) | |
tree | f53d5487845039d1ef25752111b9b37b5da99523 /base/memory | |
parent | d89140dc2e7e84bd8ee0baebbee79e0c2793f677 (diff) | |
download | chromium_src-f5027e47691dc2fe5ad4d3ff588b2f46533eca1c.zip chromium_src-f5027e47691dc2fe5ad4d3ff588b2f46533eca1c.tar.gz chromium_src-f5027e47691dc2fe5ad4d3ff588b2f46533eca1c.tar.bz2 |
Revert 81142 - Fix base::internal::WeakReference::Flag to be RefCountedThreadSafe.This allows a base::WeakPtr to be deleted on a different thread, which will modify the refcount on Flag.BUG=noneTEST=noneReview URL: http://codereview.chromium.org/6826034
TBR=willchan@chromium.org
Review URL: http://codereview.chromium.org/6821053
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@81144 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/memory')
-rw-r--r-- | base/memory/weak_ptr.cc | 24 | ||||
-rw-r--r-- | base/memory/weak_ptr.h | 23 |
2 files changed, 24 insertions, 23 deletions
diff --git a/base/memory/weak_ptr.cc b/base/memory/weak_ptr.cc index 30c777c..fb09219 100644 --- a/base/memory/weak_ptr.cc +++ b/base/memory/weak_ptr.cc @@ -10,21 +10,31 @@ namespace internal { WeakReference::Flag::Flag(Flag** handle) : handle_(handle) { } +WeakReference::Flag::~Flag() { + if (handle_) + *handle_ = NULL; +} + +void WeakReference::Flag::AddRef() const { + DCHECK(CalledOnValidThread()); + RefCounted<Flag>::AddRef(); +} + +void WeakReference::Flag::Release() const { + DCHECK(CalledOnValidThread()); + RefCounted<Flag>::Release(); +} + void WeakReference::Flag::Invalidate() { - DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK(CalledOnValidThread()); handle_ = NULL; } bool WeakReference::Flag::IsValid() const { - DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK(CalledOnValidThread()); return handle_ != NULL; } -WeakReference::Flag::~Flag() { - if (handle_) - *handle_ = NULL; -} - WeakReference::WeakReference() { } diff --git a/base/memory/weak_ptr.h b/base/memory/weak_ptr.h index 0c6b4a7..edb9d93 100644 --- a/base/memory/weak_ptr.h +++ b/base/memory/weak_ptr.h @@ -55,7 +55,7 @@ #include "base/base_api.h" #include "base/logging.h" #include "base/memory/ref_counted.h" -#include "base/threading/thread_checker.h" +#include "base/threading/non_thread_safe.h" namespace base { @@ -65,23 +65,19 @@ namespace internal { class BASE_API WeakReference { public: - // While Flag is bound to a specific thread, it may be deleted from another - // via base::WeakPtr::~WeakPtr(). - class Flag : public RefCountedThreadSafe<Flag> { + class Flag : public RefCounted<Flag>, public base::NonThreadSafe { public: - explicit Flag(Flag** handle); + Flag(Flag** handle); + ~Flag(); + void AddRef() const; + void Release() const; void Invalidate(); bool IsValid() const; - void DetachFromThread() { thread_checker_.DetachFromThread(); } + void DetachFromThread() { base::NonThreadSafe::DetachFromThread(); } private: - friend class base::RefCountedThreadSafe<Flag>; - - ~Flag(); - - ThreadChecker thread_checker_; Flag** handle_; }; @@ -239,11 +235,6 @@ class WeakPtrFactory { return weak_reference_owner_.HasRefs(); } - // Indicates that this object will be used on another thread from now on. - void DetachFromThread() { - weak_reference_owner_.DetachFromThread(); - } - private: internal::WeakReferenceOwner weak_reference_owner_; T* ptr_; |