| 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>);
|
| };
|
|
|