// Copyright 2021 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/task/sequence_manager/delayed_task_handle_delegate.h" #include "base/task/sequence_manager/task_queue_impl.h" namespace base { namespace sequence_manager { namespace internal { DelayedTaskHandleDelegate::DelayedTaskHandleDelegate(TaskQueueImpl* outer) : outer_(outer) {} DelayedTaskHandleDelegate::~DelayedTaskHandleDelegate() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(!IsValid()); } WeakPtr DelayedTaskHandleDelegate::AsWeakPtr() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return weak_ptr_factory_.GetWeakPtr(); } bool DelayedTaskHandleDelegate::IsValid() const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return weak_ptr_factory_.HasWeakPtrs(); } void DelayedTaskHandleDelegate::CancelTask() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!IsValid()) return; weak_ptr_factory_.InvalidateWeakPtrs(); // If the task is still inside the heap, then it can be removed directly. if (heap_handle_.IsValid()) outer_->RemoveCancelableTask(heap_handle_); } void DelayedTaskHandleDelegate::SetHeapHandle(HeapHandle heap_handle) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(heap_handle.IsValid()); heap_handle_ = heap_handle; } void DelayedTaskHandleDelegate::ClearHeapHandle() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); heap_handle_ = HeapHandle(); } HeapHandle DelayedTaskHandleDelegate::GetHeapHandle() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return heap_handle_; } void DelayedTaskHandleDelegate::WillRunTask() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(IsValid()); // The task must be removed from the heap before running it. DCHECK(!heap_handle_.IsValid()); weak_ptr_factory_.InvalidateWeakPtrs(); } } // namespace internal } // namespace sequence_manager } // namespace base