Index: cc/base/ref_counted_managed.h |
diff --git a/cc/base/ref_counted_managed.h b/cc/base/ref_counted_managed.h |
index 8bb836f015957ceecac9ee7d0e04193bb0ee3e91..02ad6ee95fea99f2fffe1b96e734839b37344cc4 100644 |
--- a/cc/base/ref_counted_managed.h |
+++ b/cc/base/ref_counted_managed.h |
@@ -32,11 +32,16 @@ template <typename T> |
class CC_EXPORT RefCountedManaged : public base::subtle::RefCountedBase { |
public: |
explicit RefCountedManaged(RefCountedManager<T>* manager) |
- : manager_(manager) { |
- manager_->live_object_count_++; |
+ : manager_(manager), |
+ released_(true) { |
} |
void AddRef() const { |
+ if (released_) { |
+ released_ = false; |
+ ClearInDtor(); |
+ manager_->live_object_count_++; |
+ } |
base::subtle::RefCountedBase::AddRef(); |
} |
@@ -45,6 +50,8 @@ class CC_EXPORT RefCountedManaged : public base::subtle::RefCountedBase { |
DCHECK_GT(manager_->live_object_count_, 0); |
manager_->live_object_count_--; |
+ released_ = true; |
+ |
// This must be the last statement in case manager deletes |
// the object immediately. |
manager_->Release(static_cast<T*>(this)); |
@@ -56,6 +63,7 @@ class CC_EXPORT RefCountedManaged : public base::subtle::RefCountedBase { |
private: |
RefCountedManager<T>* manager_; |
+ mutable bool released_; |
DISALLOW_COPY_AND_ASSIGN(RefCountedManaged<T>); |
}; |