| // 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" | 
 |  | 
 | namespace base { | 
 |  | 
 | namespace subtle { | 
 |  | 
 | bool RefCountedThreadSafeBase::HasOneRef() const { | 
 |   return ref_count_ == 1; | 
 | } | 
 |  | 
 | 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 | 
 |   ++ref_count_; | 
 | } | 
 |  | 
 | bool RefCountedThreadSafeBase::Release() const { | 
 | #ifndef NDEBUG | 
 |   DCHECK(!in_dtor_); | 
 |   DCHECK(ref_count_ != 0); | 
 | #endif | 
 |   if (--ref_count_ == 0) { | 
 | #ifndef NDEBUG | 
 |     in_dtor_ = true; | 
 | #endif | 
 |     return true; | 
 |   } | 
 |   return false; | 
 | } | 
 |  | 
 | }  // namespace subtle | 
 |  | 
 | }  // namespace base |