diff options
Diffstat (limited to 'base/ref_counted.h')
-rw-r--r-- | base/ref_counted.h | 17 |
1 files changed, 14 insertions, 3 deletions
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 |