1cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka// Use of this source code is governed by a BSD-style license that can be 3cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka// found in the LICENSE file. 4cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka 5cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka#include "base/callback_internal.h" 6cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka 7cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka#include "base/logging.h" 8cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka 9cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Bukanamespace base { 10cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Bukanamespace internal { 11cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka 12cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Bukavoid BindStateBase::AddRef() { 13b1fcfc0490472b48b91731df2ea0ccf41f187d33Vitaly Buka ++ref_count_; 14cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka} 15cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka 16cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Bukavoid BindStateBase::Release() { 17b1fcfc0490472b48b91731df2ea0ccf41f187d33Vitaly Buka if (--ref_count_ == 0) 18cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka destructor_(this); 19cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka} 20cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka 21cbed206b598349b26cd060eebb7e2d3b70305044Vitaly BukaCallbackBase::CallbackBase(const CallbackBase& c) = default; 22cbed206b598349b26cd060eebb7e2d3b70305044Vitaly BukaCallbackBase& CallbackBase::operator=(const CallbackBase& c) = default; 23cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka 24cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Bukavoid CallbackBase::Reset() { 25cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka polymorphic_invoke_ = NULL; 26cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka // NULL the bind_state_ last, since it may be holding the last ref to whatever 27cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka // object owns us, and we may be deleted after that. 28cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka bind_state_ = NULL; 29cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka} 30cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka 31cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Bukabool CallbackBase::Equals(const CallbackBase& other) const { 32cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka return bind_state_.get() == other.bind_state_.get() && 33cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka polymorphic_invoke_ == other.polymorphic_invoke_; 34cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka} 35cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka 36cbed206b598349b26cd060eebb7e2d3b70305044Vitaly BukaCallbackBase::CallbackBase(BindStateBase* bind_state) 37cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka : bind_state_(bind_state), 38cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka polymorphic_invoke_(NULL) { 39cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka DCHECK(!bind_state_.get() || bind_state_->ref_count_ == 1); 40cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka} 41cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka 42cbed206b598349b26cd060eebb7e2d3b70305044Vitaly BukaCallbackBase::~CallbackBase() { 43cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka} 44cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka 45cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka} // namespace internal 46cbed206b598349b26cd060eebb7e2d3b70305044Vitaly Buka} // namespace base 47