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 12 void BindStateBase::AddRef() { 13 AtomicRefCountInc(&ref_count_); 14 } 15 16 void BindStateBase::Release() { 17 if (!AtomicRefCountDec(&ref_count_)) 18 destructor_(this); 19 } 20 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>& 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 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 42 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 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 54 CallbackBase<CopyMode::MoveOnly>::~CallbackBase() {} 55 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 63 CallbackBase<CopyMode::Copyable>::CallbackBase(CallbackBase&& c) 64 : CallbackBase<CopyMode::MoveOnly>(std::move(c)) {} 65 66 CallbackBase<CopyMode::Copyable>& 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>& 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