1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/memory/ref_counted.h"
6#include "base/threading/thread_collision_warner.h"
7
8namespace base {
9
10namespace subtle {
11
12bool RefCountedThreadSafeBase::HasOneRef() const {
13  return AtomicRefCountIsOne(
14      &const_cast<RefCountedThreadSafeBase*>(this)->ref_count_);
15}
16
17RefCountedThreadSafeBase::RefCountedThreadSafeBase() : ref_count_(0) {
18#ifndef NDEBUG
19  in_dtor_ = false;
20#endif
21}
22
23RefCountedThreadSafeBase::~RefCountedThreadSafeBase() {
24#ifndef NDEBUG
25  DCHECK(in_dtor_) << "RefCountedThreadSafe object deleted without "
26                      "calling Release()";
27#endif
28}
29
30void RefCountedThreadSafeBase::AddRef() const {
31#ifndef NDEBUG
32  DCHECK(!in_dtor_);
33#endif
34  AtomicRefCountInc(&ref_count_);
35}
36
37bool RefCountedThreadSafeBase::Release() const {
38#ifndef NDEBUG
39  DCHECK(!in_dtor_);
40  DCHECK(!AtomicRefCountIsZero(&ref_count_));
41#endif
42  if (!AtomicRefCountDec(&ref_count_)) {
43#ifndef NDEBUG
44    in_dtor_ = true;
45#endif
46    return true;
47  }
48  return false;
49}
50
51}  // namespace subtle
52
53}  // namespace base
54