Index: base/memory/ref_counted.cc |
diff --git a/base/memory/ref_counted.cc b/base/memory/ref_counted.cc |
index cd6181b147349e46c4a86b7487e952d4725d1f91..2471238fd33eee4f5979f4b6dd60676d94e52bb7 100644 |
--- a/base/memory/ref_counted.cc |
+++ b/base/memory/ref_counted.cc |
@@ -3,9 +3,17 @@ |
// found in the LICENSE file. |
#include "base/memory/ref_counted.h" |
+ |
#include "base/threading/thread_collision_warner.h" |
namespace base { |
+namespace { |
+ |
+#if DCHECK_IS_ON() |
+AtomicRefCount g_cross_thread_ref_count_access_allow_count = 0; |
+#endif |
+ |
+} // namespace |
namespace subtle { |
@@ -48,6 +56,42 @@ bool RefCountedThreadSafeBase::Release() const { |
return false; |
} |
+RefCountedBase::RefCountedBase() : ref_count_(0) { |
+ DetachFromSequence(); |
+} |
+ |
+RefCountedBase::~RefCountedBase() { |
+#if DCHECK_IS_ON() |
+ DCHECK(in_dtor_) << "RefCounted object deleted without calling Release()"; |
+#endif |
+} |
gab
2017/02/16 21:38:46
Keep these inline (they're no-ops in non-dcheck bu
tzik
2017/02/17 11:36:08
Done.
|
+ |
+void RefCountedBase::DetachFromSequence() const { |
+#if DCHECK_IS_ON() |
+ sequence_checker_.DetachFromSequence(); |
+#endif |
+} |
+ |
+bool RefCountedBase::CalledOnValidSequence() const { |
+#if DCHECK_IS_ON() |
+ if (!AtomicRefCountIsZero(&g_cross_thread_ref_count_access_allow_count)) |
+ return true; |
+ return sequence_checker_.CalledOnValidSequence(); |
gab
2017/02/16 21:38:46
Merge if into this call:
return CalledOnValidSequ
tzik
2017/02/17 11:36:08
Done.
|
+#else |
+ return true; |
+#endif |
+} |
+ |
} // namespace subtle |
+#if DCHECK_IS_ON() |
+ScopedAllowCrossThreadRefCountAccess::ScopedAllowCrossThreadRefCountAccess() { |
+ AtomicRefCountInc(&g_cross_thread_ref_count_access_allow_count); |
+} |
+ |
+ScopedAllowCrossThreadRefCountAccess::~ScopedAllowCrossThreadRefCountAccess() { |
+ AtomicRefCountDec(&g_cross_thread_ref_count_access_allow_count); |
+} |
+#endif |
+ |
} // namespace base |