Index: base/memory/ref_counted.cc |
diff --git a/base/memory/ref_counted.cc b/base/memory/ref_counted.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f5924d0fe76e44672ca24372f93b40d418f46b62 |
--- /dev/null |
+++ b/base/memory/ref_counted.cc |
@@ -0,0 +1,53 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/memory/ref_counted.h" |
+#include "base/threading/thread_collision_warner.h" |
+ |
+namespace base { |
+ |
+namespace subtle { |
+ |
+bool RefCountedThreadSafeBase::HasOneRef() const { |
+ return AtomicRefCountIsOne( |
+ &const_cast<RefCountedThreadSafeBase*>(this)->ref_count_); |
+} |
+ |
+RefCountedThreadSafeBase::RefCountedThreadSafeBase() : ref_count_(0) { |
+#ifndef NDEBUG |
+ in_dtor_ = false; |
+#endif |
+} |
+ |
+RefCountedThreadSafeBase::~RefCountedThreadSafeBase() { |
+#ifndef NDEBUG |
+ DCHECK(in_dtor_) << "RefCountedThreadSafe object deleted without " |
+ "calling Release()"; |
+#endif |
+} |
+ |
+void RefCountedThreadSafeBase::AddRef() const { |
+#ifndef NDEBUG |
+ DCHECK(!in_dtor_); |
+#endif |
+ AtomicRefCountInc(&ref_count_); |
+} |
+ |
+bool RefCountedThreadSafeBase::Release() const { |
+#ifndef NDEBUG |
+ DCHECK(!in_dtor_); |
+ DCHECK(!AtomicRefCountIsZero(&ref_count_)); |
+#endif |
+ if (!AtomicRefCountDec(&ref_count_)) { |
+#ifndef NDEBUG |
+ in_dtor_ = true; |
+#endif |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+} // namespace subtle |
+ |
+} // namespace base |