| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef BASE_MEMORY_REF_COUNTED_H_ | 5 #ifndef BASE_MEMORY_REF_COUNTED_H_ |
| 6 #define BASE_MEMORY_REF_COUNTED_H_ | 6 #define BASE_MEMORY_REF_COUNTED_H_ |
| 7 | 7 |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 | 9 |
| 10 #include <cassert> | 10 #include <cassert> |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 protected: | 135 protected: |
| 136 explicit RefCountedThreadSafeBase(StartRefCountFromZeroTag) {} | 136 explicit RefCountedThreadSafeBase(StartRefCountFromZeroTag) {} |
| 137 explicit RefCountedThreadSafeBase(StartRefCountFromOneTag) : ref_count_(1) { | 137 explicit RefCountedThreadSafeBase(StartRefCountFromOneTag) : ref_count_(1) { |
| 138 #if DCHECK_IS_ON() | 138 #if DCHECK_IS_ON() |
| 139 needs_adopt_ref_ = true; | 139 needs_adopt_ref_ = true; |
| 140 #endif | 140 #endif |
| 141 } | 141 } |
| 142 | 142 |
| 143 ~RefCountedThreadSafeBase(); | 143 ~RefCountedThreadSafeBase(); |
| 144 | 144 |
| 145 void AddRef() const; | 145 void AddRef() const { |
| 146 #if DCHECK_IS_ON() |
| 147 DCHECK(!in_dtor_); |
| 148 DCHECK(!needs_adopt_ref_) |
| 149 << "This RefCounted object is created with non-zero reference count." |
| 150 << " The first reference to such a object has to be made by AdoptRef or" |
| 151 << " MakeRefCounted."; |
| 152 #endif |
| 153 AtomicRefCountInc(&ref_count_); |
| 154 } |
| 146 | 155 |
| 147 // Returns true if the object should self-delete. | 156 // Returns true if the object should self-delete. |
| 148 bool Release() const; | 157 bool Release() const { |
| 158 #if DCHECK_IS_ON() |
| 159 DCHECK(!in_dtor_); |
| 160 DCHECK(!AtomicRefCountIsZero(&ref_count_)); |
| 161 #endif |
| 162 if (!AtomicRefCountDec(&ref_count_)) { |
| 163 #if DCHECK_IS_ON() |
| 164 in_dtor_ = true; |
| 165 #endif |
| 166 return true; |
| 167 } |
| 168 return false; |
| 169 } |
| 149 | 170 |
| 150 private: | 171 private: |
| 151 template <typename U> | 172 template <typename U> |
| 152 friend scoped_refptr<U> base::AdoptRef(U*); | 173 friend scoped_refptr<U> base::AdoptRef(U*); |
| 153 | 174 |
| 154 void Adopted() const { | 175 void Adopted() const { |
| 155 #if DCHECK_IS_ON() | 176 #if DCHECK_IS_ON() |
| 156 DCHECK(needs_adopt_ref_); | 177 DCHECK(needs_adopt_ref_); |
| 157 needs_adopt_ref_ = false; | 178 needs_adopt_ref_ = false; |
| 158 #endif | 179 #endif |
| (...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 618 bool operator!=(std::nullptr_t null, const scoped_refptr<T>& rhs) { | 639 bool operator!=(std::nullptr_t null, const scoped_refptr<T>& rhs) { |
| 619 return !operator==(null, rhs); | 640 return !operator==(null, rhs); |
| 620 } | 641 } |
| 621 | 642 |
| 622 template <typename T> | 643 template <typename T> |
| 623 std::ostream& operator<<(std::ostream& out, const scoped_refptr<T>& p) { | 644 std::ostream& operator<<(std::ostream& out, const scoped_refptr<T>& p) { |
| 624 return out << p.get(); | 645 return out << p.get(); |
| 625 } | 646 } |
| 626 | 647 |
| 627 #endif // BASE_MEMORY_REF_COUNTED_H_ | 648 #endif // BASE_MEMORY_REF_COUNTED_H_ |
| OLD | NEW |