diff options
author | ajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-14 20:51:18 +0000 |
---|---|---|
committer | ajwong@chromium.org <ajwong@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-14 20:51:18 +0000 |
commit | fbbaad5f3cc19ff3cc06bcadb5390064d1a4b077 (patch) | |
tree | 28027947434db1cecbdb781b727b8b2252ca2cc9 /base | |
parent | f258bbe05f0e0ff5580639ff1ede4b6f80a3bd58 (diff) | |
download | chromium_src-fbbaad5f3cc19ff3cc06bcadb5390064d1a4b077.zip chromium_src-fbbaad5f3cc19ff3cc06bcadb5390064d1a4b077.tar.gz chromium_src-fbbaad5f3cc19ff3cc06bcadb5390064d1a4b077.tar.bz2 |
Redo "Add extra heap-allocation to refcounting. For perf test only."
Leaving it in tree for longer perf testing.
Original review http://codereview.chromium.org/6484024/
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/6517022
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@74850 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base')
-rw-r--r-- | base/ref_counted.cc | 20 | ||||
-rw-r--r-- | base/ref_counted.h | 17 |
2 files changed, 26 insertions, 11 deletions
diff --git a/base/ref_counted.cc b/base/ref_counted.cc index 2d459ae..54c1071 100644 --- a/base/ref_counted.cc +++ b/base/ref_counted.cc @@ -12,7 +12,7 @@ namespace base { namespace subtle { RefCountedBase::RefCountedBase() - : ref_count_(0) + : counter_holder_(new CounterHolder) #ifndef NDEBUG , in_dtor_(false) #endif @@ -20,6 +20,7 @@ RefCountedBase::RefCountedBase() } RefCountedBase::~RefCountedBase() { + delete counter_holder_; #ifndef NDEBUG DCHECK(in_dtor_) << "RefCounted object deleted without calling Release()"; #endif @@ -32,7 +33,7 @@ void RefCountedBase::AddRef() const { #ifndef NDEBUG DCHECK(!in_dtor_); #endif - ++ref_count_; + ++(counter_holder_->ref_count); } bool RefCountedBase::Release() const { @@ -42,7 +43,7 @@ bool RefCountedBase::Release() const { #ifndef NDEBUG DCHECK(!in_dtor_); #endif - if (--ref_count_ == 0) { + if (--(counter_holder_->ref_count) == 0) { #ifndef NDEBUG in_dtor_ = true; #endif @@ -53,16 +54,19 @@ bool RefCountedBase::Release() const { bool RefCountedThreadSafeBase::HasOneRef() const { return AtomicRefCountIsOne( - &const_cast<RefCountedThreadSafeBase*>(this)->ref_count_); + &const_cast<RefCountedThreadSafeBase*>(this)-> + counter_holder_->ref_count); } -RefCountedThreadSafeBase::RefCountedThreadSafeBase() : ref_count_(0) { +RefCountedThreadSafeBase::RefCountedThreadSafeBase() + : counter_holder_(new CounterHolder) { #ifndef NDEBUG in_dtor_ = false; #endif } RefCountedThreadSafeBase::~RefCountedThreadSafeBase() { + delete counter_holder_; #ifndef NDEBUG DCHECK(in_dtor_) << "RefCountedThreadSafe object deleted without " "calling Release()"; @@ -73,15 +77,15 @@ void RefCountedThreadSafeBase::AddRef() const { #ifndef NDEBUG DCHECK(!in_dtor_); #endif - AtomicRefCountInc(&ref_count_); + AtomicRefCountInc(&counter_holder_->ref_count); } bool RefCountedThreadSafeBase::Release() const { #ifndef NDEBUG DCHECK(!in_dtor_); - DCHECK(!AtomicRefCountIsZero(&ref_count_)); + DCHECK(!AtomicRefCountIsZero(&counter_holder_->ref_count)); #endif - if (!AtomicRefCountDec(&ref_count_)) { + if (!AtomicRefCountDec(&counter_holder_->ref_count)) { #ifndef NDEBUG in_dtor_ = true; #endif diff --git a/base/ref_counted.h b/base/ref_counted.h index 4c3aeb8..6a2b996 100644 --- a/base/ref_counted.h +++ b/base/ref_counted.h @@ -17,19 +17,25 @@ class RefCountedBase { public: static bool ImplementsThreadSafeReferenceCounting() { return false; } - bool HasOneRef() const { return ref_count_ == 1; } + bool HasOneRef() const { return counter_holder_->ref_count == 1; } protected: RefCountedBase(); ~RefCountedBase(); + struct CounterHolder { + CounterHolder() : ref_count(0), weak_count(0) {} + int ref_count; + int weak_count; // Simulates weak pointer. + }; + void AddRef() const; // Returns true if the object should self-delete. bool Release() const; private: - mutable int ref_count_; + mutable CounterHolder* counter_holder_; #ifndef NDEBUG mutable bool in_dtor_; #endif @@ -55,7 +61,12 @@ class RefCountedThreadSafeBase { bool Release() const; private: - mutable AtomicRefCount ref_count_; + struct CounterHolder { + CounterHolder() : ref_count(0), weak_count(0) {} + AtomicRefCount ref_count; + AtomicRefCount weak_count; // Simulates weak pointer. + }; + mutable CounterHolder* counter_holder_; #ifndef NDEBUG mutable bool in_dtor_; #endif |