• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "base/callback_internal.h"
6 
7 #include "base/logging.h"
8 
9 namespace base {
10 namespace internal {
11 
AddRef()12 void BindStateBase::AddRef() {
13   AtomicRefCountInc(&ref_count_);
14 }
15 
Release()16 void BindStateBase::Release() {
17   if (!AtomicRefCountDec(&ref_count_))
18     destructor_(this);
19 }
20 
CallbackBase(CallbackBase && c)21 CallbackBase<CopyMode::MoveOnly>::CallbackBase(CallbackBase&& c)
22     : bind_state_(std::move(c.bind_state_)),
23       polymorphic_invoke_(c.polymorphic_invoke_) {
24   c.polymorphic_invoke_ = nullptr;
25 }
26 
27 CallbackBase<CopyMode::MoveOnly>&
operator =(CallbackBase && c)28 CallbackBase<CopyMode::MoveOnly>::operator=(CallbackBase&& c) {
29   bind_state_ = std::move(c.bind_state_);
30   polymorphic_invoke_ = c.polymorphic_invoke_;
31   c.polymorphic_invoke_ = nullptr;
32   return *this;
33 }
34 
Reset()35 void CallbackBase<CopyMode::MoveOnly>::Reset() {
36   polymorphic_invoke_ = nullptr;
37   // NULL the bind_state_ last, since it may be holding the last ref to whatever
38   // object owns us, and we may be deleted after that.
39   bind_state_ = nullptr;
40 }
41 
EqualsInternal(const CallbackBase & other) const42 bool CallbackBase<CopyMode::MoveOnly>::EqualsInternal(
43     const CallbackBase& other) const {
44   return bind_state_.get() == other.bind_state_.get() &&
45          polymorphic_invoke_ == other.polymorphic_invoke_;
46 }
47 
CallbackBase(BindStateBase * bind_state)48 CallbackBase<CopyMode::MoveOnly>::CallbackBase(
49     BindStateBase* bind_state)
50     : bind_state_(bind_state) {
51   DCHECK(!bind_state_.get() || bind_state_->ref_count_ == 1);
52 }
53 
~CallbackBase()54 CallbackBase<CopyMode::MoveOnly>::~CallbackBase() {}
55 
CallbackBase(const CallbackBase & c)56 CallbackBase<CopyMode::Copyable>::CallbackBase(
57     const CallbackBase& c)
58     : CallbackBase<CopyMode::MoveOnly>(nullptr) {
59   bind_state_ = c.bind_state_;
60   polymorphic_invoke_ = c.polymorphic_invoke_;
61 }
62 
CallbackBase(CallbackBase && c)63 CallbackBase<CopyMode::Copyable>::CallbackBase(CallbackBase&& c)
64     : CallbackBase<CopyMode::MoveOnly>(std::move(c)) {}
65 
66 CallbackBase<CopyMode::Copyable>&
operator =(const CallbackBase & c)67 CallbackBase<CopyMode::Copyable>::operator=(const CallbackBase& c) {
68   bind_state_ = c.bind_state_;
69   polymorphic_invoke_ = c.polymorphic_invoke_;
70   return *this;
71 }
72 
73 CallbackBase<CopyMode::Copyable>&
operator =(CallbackBase && c)74 CallbackBase<CopyMode::Copyable>::operator=(CallbackBase&& c) {
75   *static_cast<CallbackBase<CopyMode::MoveOnly>*>(this) = std::move(c);
76   return *this;
77 }
78 
79 template class CallbackBase<CopyMode::MoveOnly>;
80 template class CallbackBase<CopyMode::Copyable>;
81 
82 }  // namespace internal
83 }  // namespace base
84