152 lines
4.7 KiB
C++
152 lines
4.7 KiB
C++
// Copyright 2018 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/tasks.h"
|
|
|
|
#include "base/task/sequence_manager/task_order.h"
|
|
|
|
namespace base {
|
|
namespace sequence_manager {
|
|
|
|
Task::Task(internal::PostedTask posted_task,
|
|
EnqueueOrder sequence_order,
|
|
EnqueueOrder enqueue_order,
|
|
TimeTicks queue_time,
|
|
WakeUpResolution resolution,
|
|
TimeDelta leeway)
|
|
: PendingTask(posted_task.location,
|
|
std::move(posted_task.callback),
|
|
queue_time,
|
|
absl::holds_alternative<base::TimeTicks>(
|
|
posted_task.delay_or_delayed_run_time)
|
|
? absl::get<base::TimeTicks>(
|
|
posted_task.delay_or_delayed_run_time)
|
|
: base::TimeTicks(),
|
|
leeway,
|
|
posted_task.delay_policy),
|
|
nestable(posted_task.nestable),
|
|
task_type(posted_task.task_type),
|
|
task_runner(std::move(posted_task.task_runner)),
|
|
enqueue_order_(enqueue_order),
|
|
delayed_task_handle_delegate_(
|
|
std::move(posted_task.delayed_task_handle_delegate)) {
|
|
DCHECK(!absl::holds_alternative<base::TimeDelta>(
|
|
posted_task.delay_or_delayed_run_time) ||
|
|
absl::get<base::TimeDelta>(posted_task.delay_or_delayed_run_time)
|
|
.is_zero());
|
|
// We use |sequence_num| when comparing PendingTask for ordering purposes
|
|
// and it may wrap around to a negative number during the static cast, hence,
|
|
// TaskQueueImpl::DelayedIncomingQueue is especially sensitive to a potential
|
|
// change of |PendingTask::sequence_num|'s type.
|
|
static_assert(std::is_same<decltype(sequence_num), int>::value, "");
|
|
sequence_num = static_cast<int>(sequence_order);
|
|
this->is_high_res = resolution == WakeUpResolution::kHigh;
|
|
}
|
|
|
|
Task::Task(Task&& move_from) = default;
|
|
|
|
Task::~Task() = default;
|
|
|
|
Task& Task::operator=(Task&& other) = default;
|
|
|
|
TaskOrder Task::task_order() const {
|
|
return TaskOrder(
|
|
enqueue_order(),
|
|
delayed_run_time.is_null() ? TimeTicks() : latest_delayed_run_time(),
|
|
sequence_num);
|
|
}
|
|
|
|
void Task::SetHeapHandle(HeapHandle heap_handle) {
|
|
if (!delayed_task_handle_delegate_)
|
|
return;
|
|
|
|
delayed_task_handle_delegate_->SetHeapHandle(heap_handle);
|
|
}
|
|
|
|
void Task::ClearHeapHandle() {
|
|
if (!delayed_task_handle_delegate_)
|
|
return;
|
|
delayed_task_handle_delegate_->ClearHeapHandle();
|
|
}
|
|
|
|
HeapHandle Task::GetHeapHandle() const {
|
|
if (!delayed_task_handle_delegate_)
|
|
return HeapHandle::Invalid();
|
|
return delayed_task_handle_delegate_->GetHeapHandle();
|
|
}
|
|
|
|
bool Task::IsCanceled() const {
|
|
CHECK(task);
|
|
if (task.IsCancelled()) {
|
|
DCHECK(!delayed_task_handle_delegate_);
|
|
return true;
|
|
}
|
|
|
|
return delayed_task_handle_delegate_.WasInvalidated();
|
|
}
|
|
|
|
bool Task::WillRunTask() {
|
|
if (delayed_task_handle_delegate_.WasInvalidated()) {
|
|
return false;
|
|
}
|
|
if (delayed_task_handle_delegate_) {
|
|
delayed_task_handle_delegate_->WillRunTask();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
TimeTicks WakeUp::earliest_time() const {
|
|
if (delay_policy == subtle::DelayPolicy::kFlexiblePreferEarly)
|
|
return time - leeway;
|
|
return time;
|
|
}
|
|
|
|
TimeTicks WakeUp::latest_time() const {
|
|
if (delay_policy == subtle::DelayPolicy::kFlexibleNoSooner)
|
|
return time + leeway;
|
|
return time;
|
|
}
|
|
|
|
namespace internal {
|
|
PostedTask::PostedTask(
|
|
scoped_refptr<SequencedTaskRunner> task_runner,
|
|
OnceClosure callback,
|
|
Location location,
|
|
TimeDelta delay,
|
|
Nestable nestable,
|
|
TaskType task_type,
|
|
WeakPtr<DelayedTaskHandleDelegate> delayed_task_handle_delegate)
|
|
: callback(std::move(callback)),
|
|
location(location),
|
|
nestable(nestable),
|
|
task_type(task_type),
|
|
delay_or_delayed_run_time(delay),
|
|
task_runner(std::move(task_runner)),
|
|
delayed_task_handle_delegate(std::move(delayed_task_handle_delegate)) {}
|
|
|
|
PostedTask::PostedTask(
|
|
scoped_refptr<SequencedTaskRunner> task_runner,
|
|
OnceClosure callback,
|
|
Location location,
|
|
TimeTicks delayed_run_time,
|
|
subtle::DelayPolicy delay_policy,
|
|
Nestable nestable,
|
|
TaskType task_type,
|
|
WeakPtr<DelayedTaskHandleDelegate> delayed_task_handle_delegate)
|
|
: callback(std::move(callback)),
|
|
location(location),
|
|
nestable(nestable),
|
|
task_type(task_type),
|
|
delay_or_delayed_run_time(delayed_run_time),
|
|
delay_policy(delay_policy),
|
|
task_runner(std::move(task_runner)),
|
|
delayed_task_handle_delegate(std::move(delayed_task_handle_delegate)) {}
|
|
|
|
PostedTask::PostedTask(PostedTask&& move_from) noexcept = default;
|
|
PostedTask::~PostedTask() = default;
|
|
|
|
} // namespace internal
|
|
} // namespace sequence_manager
|
|
} // namespace base
|