|  | /* | 
|  | *  Copyright 2018 The WebRTC Project Authors. All rights reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #include "rtc_base/cancelable_task_handle.h" | 
|  |  | 
|  | #include <utility> | 
|  |  | 
|  | #include "rtc_base/refcounter.h" | 
|  | #include "rtc_base/sequenced_task_checker.h" | 
|  | #include "rtc_base/thread_annotations.h" | 
|  | #include "rtc_base/thread_checker.h" | 
|  |  | 
|  | namespace rtc { | 
|  |  | 
|  | class CancelableTaskHandle::CancellationToken { | 
|  | public: | 
|  | CancellationToken() : canceled_(false), ref_count_(0) { checker_.Detach(); } | 
|  | CancellationToken(const CancellationToken&) = delete; | 
|  | CancellationToken& operator=(const CancellationToken&) = delete; | 
|  |  | 
|  | void Cancel() { | 
|  | RTC_DCHECK_RUN_ON(&checker_); | 
|  | canceled_ = true; | 
|  | } | 
|  |  | 
|  | bool Canceled() { | 
|  | RTC_DCHECK_RUN_ON(&checker_); | 
|  | return canceled_; | 
|  | } | 
|  |  | 
|  | void AddRef() { ref_count_.IncRef(); } | 
|  |  | 
|  | void Release() { | 
|  | if (ref_count_.DecRef() == rtc::RefCountReleaseStatus::kDroppedLastRef) | 
|  | delete this; | 
|  | } | 
|  |  | 
|  | private: | 
|  | ~CancellationToken() = default; | 
|  |  | 
|  | rtc::SequencedTaskChecker checker_; | 
|  | bool canceled_ RTC_GUARDED_BY(checker_); | 
|  | webrtc::webrtc_impl::RefCounter ref_count_; | 
|  | }; | 
|  |  | 
|  | CancelableTaskHandle::CancelableTaskHandle() = default; | 
|  | CancelableTaskHandle::CancelableTaskHandle(const CancelableTaskHandle&) = | 
|  | default; | 
|  | CancelableTaskHandle::CancelableTaskHandle(CancelableTaskHandle&&) = default; | 
|  | CancelableTaskHandle& CancelableTaskHandle::operator=( | 
|  | const CancelableTaskHandle&) = default; | 
|  | CancelableTaskHandle& CancelableTaskHandle::operator=(CancelableTaskHandle&&) = | 
|  | default; | 
|  | CancelableTaskHandle::~CancelableTaskHandle() = default; | 
|  |  | 
|  | void CancelableTaskHandle::Cancel() const { | 
|  | if (cancellation_token_.get() != nullptr) | 
|  | cancellation_token_->Cancel(); | 
|  | } | 
|  |  | 
|  | CancelableTaskHandle::CancelableTaskHandle( | 
|  | rtc::scoped_refptr<CancellationToken> cancellation_token) | 
|  | : cancellation_token_(std::move(cancellation_token)) {} | 
|  |  | 
|  | BaseCancelableTask::~BaseCancelableTask() = default; | 
|  |  | 
|  | CancelableTaskHandle BaseCancelableTask::GetCancellationHandle() const { | 
|  | return CancelableTaskHandle(cancellation_token_); | 
|  | } | 
|  |  | 
|  | BaseCancelableTask::BaseCancelableTask() | 
|  | : cancellation_token_(new CancelableTaskHandle::CancellationToken) {} | 
|  |  | 
|  | bool BaseCancelableTask::Canceled() const { | 
|  | return cancellation_token_->Canceled(); | 
|  | } | 
|  |  | 
|  | }  // namespace rtc |