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