[email protected] | 0f45036 | 2012-06-09 02:11:01 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
[email protected] | 59eff91 | 2011-02-18 23:29:31 | [diff] [blame] | 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 | |
Hans Wennborg | c3cffa6 | 2020-04-27 10:09:12 | [diff] [blame] | 7 | #include "base/check.h" |
| 8 | #include "base/notreached.h" |
[email protected] | e24f876 | 2011-12-20 00:10:04 | [diff] [blame] | 9 | |
[email protected] | 59eff91 | 2011-02-18 23:29:31 | [diff] [blame] | 10 | namespace base { |
| 11 | namespace internal { |
| 12 | |
tzik | 1fdcca3 | 2016-09-14 07:15:00 | [diff] [blame] | 13 | namespace { |
| 14 | |
tzik | 9697d49e | 2018-08-02 13:35:19 | [diff] [blame] | 15 | bool QueryCancellationTraitsForNonCancellables( |
| 16 | const BindStateBase*, |
| 17 | BindStateBase::CancellationQueryMode mode) { |
| 18 | switch (mode) { |
| 19 | case BindStateBase::IS_CANCELLED: |
| 20 | return false; |
| 21 | case BindStateBase::MAYBE_VALID: |
| 22 | return true; |
| 23 | } |
| 24 | NOTREACHED(); |
Nicolas Ouellet-payeur | 40f8e9a | 2018-07-30 16:26:48 | [diff] [blame] | 25 | } |
| 26 | |
tzik | 1fdcca3 | 2016-09-14 07:15:00 | [diff] [blame] | 27 | } // namespace |
| 28 | |
tzik | 65adef8 | 2017-03-30 06:45:21 | [diff] [blame] | 29 | void BindStateBaseRefCountTraits::Destruct(const BindStateBase* bind_state) { |
| 30 | bind_state->destructor_(bind_state); |
| 31 | } |
| 32 | |
tzik | 1fdcca3 | 2016-09-14 07:15:00 | [diff] [blame] | 33 | BindStateBase::BindStateBase(InvokeFuncStorage polymorphic_invoke, |
tzik | 30e0c31 | 2016-09-21 08:06:54 | [diff] [blame] | 34 | void (*destructor)(const BindStateBase*)) |
tzik | 9697d49e | 2018-08-02 13:35:19 | [diff] [blame] | 35 | : BindStateBase(polymorphic_invoke, |
| 36 | destructor, |
| 37 | &QueryCancellationTraitsForNonCancellables) {} |
tzik | 1fdcca3 | 2016-09-14 07:15:00 | [diff] [blame] | 38 | |
tzik | 9697d49e | 2018-08-02 13:35:19 | [diff] [blame] | 39 | BindStateBase::BindStateBase( |
| 40 | InvokeFuncStorage polymorphic_invoke, |
| 41 | void (*destructor)(const BindStateBase*), |
| 42 | bool (*query_cancellation_traits)(const BindStateBase*, |
| 43 | CancellationQueryMode)) |
tzik | 1fdcca3 | 2016-09-14 07:15:00 | [diff] [blame] | 44 | : polymorphic_invoke_(polymorphic_invoke), |
tzik | 1fdcca3 | 2016-09-14 07:15:00 | [diff] [blame] | 45 | destructor_(destructor), |
tzik | 9697d49e | 2018-08-02 13:35:19 | [diff] [blame] | 46 | query_cancellation_traits_(query_cancellation_traits) {} |
tzik | f1b37772 | 2016-09-08 06:58:07 | [diff] [blame] | 47 | |
tzik | e4bb1a0 | 2018-05-21 08:05:17 | [diff] [blame] | 48 | CallbackBase& CallbackBase::operator=(CallbackBase&& c) noexcept = default; |
tzik | d4bb5b7d | 2017-08-28 19:08:52 | [diff] [blame] | 49 | CallbackBase::CallbackBase(const CallbackBaseCopyable& c) |
tzik | 27d1e31 | 2016-09-13 05:28:59 | [diff] [blame] | 50 | : bind_state_(c.bind_state_) {} |
| 51 | |
tzik | d4bb5b7d | 2017-08-28 19:08:52 | [diff] [blame] | 52 | CallbackBase& CallbackBase::operator=(const CallbackBaseCopyable& c) { |
tzik | 27d1e31 | 2016-09-13 05:28:59 | [diff] [blame] | 53 | bind_state_ = c.bind_state_; |
| 54 | return *this; |
| 55 | } |
| 56 | |
tzik | e4bb1a0 | 2018-05-21 08:05:17 | [diff] [blame] | 57 | CallbackBase::CallbackBase(CallbackBaseCopyable&& c) noexcept |
tzik | f44c2f8d | 2017-03-08 08:41:15 | [diff] [blame] | 58 | : bind_state_(std::move(c.bind_state_)) {} |
| 59 | |
tzik | e4bb1a0 | 2018-05-21 08:05:17 | [diff] [blame] | 60 | CallbackBase& CallbackBase::operator=(CallbackBaseCopyable&& c) noexcept { |
tzik | f44c2f8d | 2017-03-08 08:41:15 | [diff] [blame] | 61 | bind_state_ = std::move(c.bind_state_); |
| 62 | return *this; |
| 63 | } |
| 64 | |
tzik | d4bb5b7d | 2017-08-28 19:08:52 | [diff] [blame] | 65 | void CallbackBase::Reset() { |
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame] | 66 | // NULL the bind_state_ last, since it may be holding the last ref to whatever |
| 67 | // object owns us, and we may be deleted after that. |
| 68 | bind_state_ = nullptr; |
| 69 | } |
| 70 | |
tzik | d4bb5b7d | 2017-08-28 19:08:52 | [diff] [blame] | 71 | bool CallbackBase::IsCancelled() const { |
tzik | 59aa6bb1 | 2016-09-08 10:58:53 | [diff] [blame] | 72 | DCHECK(bind_state_); |
| 73 | return bind_state_->IsCancelled(); |
| 74 | } |
| 75 | |
Nicolas Ouellet-payeur | 40f8e9a | 2018-07-30 16:26:48 | [diff] [blame] | 76 | bool CallbackBase::MaybeValid() const { |
| 77 | DCHECK(bind_state_); |
| 78 | return bind_state_->MaybeValid(); |
| 79 | } |
| 80 | |
tzik | d4bb5b7d | 2017-08-28 19:08:52 | [diff] [blame] | 81 | bool CallbackBase::EqualsInternal(const CallbackBase& other) const { |
tzik | 1886c27 | 2016-09-08 05:45:38 | [diff] [blame] | 82 | return bind_state_ == other.bind_state_; |
[email protected] | 59eff91 | 2011-02-18 23:29:31 | [diff] [blame] | 83 | } |
| 84 | |
Chris Watkins | bb7211c | 2017-11-29 07:16:38 | [diff] [blame] | 85 | CallbackBase::~CallbackBase() = default; |
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame] | 86 | |
tzik | 787d420b | 2018-06-25 16:12:02 | [diff] [blame] | 87 | CallbackBaseCopyable::CallbackBaseCopyable(const CallbackBaseCopyable& c) { |
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame] | 88 | bind_state_ = c.bind_state_; |
[email protected] | 59eff91 | 2011-02-18 23:29:31 | [diff] [blame] | 89 | } |
| 90 | |
tzik | d4bb5b7d | 2017-08-28 19:08:52 | [diff] [blame] | 91 | CallbackBaseCopyable& CallbackBaseCopyable::operator=( |
| 92 | const CallbackBaseCopyable& c) { |
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame] | 93 | bind_state_ = c.bind_state_; |
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame] | 94 | return *this; |
| 95 | } |
| 96 | |
tzik | d4bb5b7d | 2017-08-28 19:08:52 | [diff] [blame] | 97 | CallbackBaseCopyable& CallbackBaseCopyable::operator=( |
tzik | e4bb1a0 | 2018-05-21 08:05:17 | [diff] [blame] | 98 | CallbackBaseCopyable&& c) noexcept = default; |
tzik | 77d41139 | 2016-03-09 09:47:03 | [diff] [blame] | 99 | |
[email protected] | 59eff91 | 2011-02-18 23:29:31 | [diff] [blame] | 100 | } // namespace internal |
[email protected] | 0f45036 | 2012-06-09 02:11:01 | [diff] [blame] | 101 | } // namespace base |