1*6777b538SAndroid Build Coastguard Worker // Copyright 2018 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/task/sequence_manager/tasks.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "base/task/sequence_manager/task_order.h"
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker namespace base {
10*6777b538SAndroid Build Coastguard Worker namespace sequence_manager {
11*6777b538SAndroid Build Coastguard Worker
Task(internal::PostedTask posted_task,EnqueueOrder sequence_order,EnqueueOrder enqueue_order,TimeTicks queue_time,WakeUpResolution resolution,TimeDelta leeway)12*6777b538SAndroid Build Coastguard Worker Task::Task(internal::PostedTask posted_task,
13*6777b538SAndroid Build Coastguard Worker EnqueueOrder sequence_order,
14*6777b538SAndroid Build Coastguard Worker EnqueueOrder enqueue_order,
15*6777b538SAndroid Build Coastguard Worker TimeTicks queue_time,
16*6777b538SAndroid Build Coastguard Worker WakeUpResolution resolution,
17*6777b538SAndroid Build Coastguard Worker TimeDelta leeway)
18*6777b538SAndroid Build Coastguard Worker : PendingTask(posted_task.location,
19*6777b538SAndroid Build Coastguard Worker std::move(posted_task.callback),
20*6777b538SAndroid Build Coastguard Worker queue_time,
21*6777b538SAndroid Build Coastguard Worker absl::holds_alternative<base::TimeTicks>(
22*6777b538SAndroid Build Coastguard Worker posted_task.delay_or_delayed_run_time)
23*6777b538SAndroid Build Coastguard Worker ? absl::get<base::TimeTicks>(
24*6777b538SAndroid Build Coastguard Worker posted_task.delay_or_delayed_run_time)
25*6777b538SAndroid Build Coastguard Worker : base::TimeTicks(),
26*6777b538SAndroid Build Coastguard Worker leeway,
27*6777b538SAndroid Build Coastguard Worker posted_task.delay_policy),
28*6777b538SAndroid Build Coastguard Worker nestable(posted_task.nestable),
29*6777b538SAndroid Build Coastguard Worker task_type(posted_task.task_type),
30*6777b538SAndroid Build Coastguard Worker task_runner(std::move(posted_task.task_runner)),
31*6777b538SAndroid Build Coastguard Worker enqueue_order_(enqueue_order),
32*6777b538SAndroid Build Coastguard Worker delayed_task_handle_delegate_(
33*6777b538SAndroid Build Coastguard Worker std::move(posted_task.delayed_task_handle_delegate)) {
34*6777b538SAndroid Build Coastguard Worker DCHECK(!absl::holds_alternative<base::TimeDelta>(
35*6777b538SAndroid Build Coastguard Worker posted_task.delay_or_delayed_run_time) ||
36*6777b538SAndroid Build Coastguard Worker absl::get<base::TimeDelta>(posted_task.delay_or_delayed_run_time)
37*6777b538SAndroid Build Coastguard Worker .is_zero());
38*6777b538SAndroid Build Coastguard Worker // We use |sequence_num| when comparing PendingTask for ordering purposes
39*6777b538SAndroid Build Coastguard Worker // and it may wrap around to a negative number during the static cast, hence,
40*6777b538SAndroid Build Coastguard Worker // TaskQueueImpl::DelayedIncomingQueue is especially sensitive to a potential
41*6777b538SAndroid Build Coastguard Worker // change of |PendingTask::sequence_num|'s type.
42*6777b538SAndroid Build Coastguard Worker static_assert(std::is_same_v<decltype(sequence_num), int>, "");
43*6777b538SAndroid Build Coastguard Worker sequence_num = static_cast<int>(sequence_order);
44*6777b538SAndroid Build Coastguard Worker this->is_high_res = resolution == WakeUpResolution::kHigh;
45*6777b538SAndroid Build Coastguard Worker }
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Worker Task::Task(Task&& move_from) = default;
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard Worker Task::~Task() = default;
50*6777b538SAndroid Build Coastguard Worker
51*6777b538SAndroid Build Coastguard Worker Task& Task::operator=(Task&& other) = default;
52*6777b538SAndroid Build Coastguard Worker
task_order() const53*6777b538SAndroid Build Coastguard Worker TaskOrder Task::task_order() const {
54*6777b538SAndroid Build Coastguard Worker return TaskOrder(
55*6777b538SAndroid Build Coastguard Worker enqueue_order(),
56*6777b538SAndroid Build Coastguard Worker delayed_run_time.is_null() ? TimeTicks() : latest_delayed_run_time(),
57*6777b538SAndroid Build Coastguard Worker sequence_num);
58*6777b538SAndroid Build Coastguard Worker }
59*6777b538SAndroid Build Coastguard Worker
SetHeapHandle(HeapHandle heap_handle)60*6777b538SAndroid Build Coastguard Worker void Task::SetHeapHandle(HeapHandle heap_handle) {
61*6777b538SAndroid Build Coastguard Worker if (!delayed_task_handle_delegate_)
62*6777b538SAndroid Build Coastguard Worker return;
63*6777b538SAndroid Build Coastguard Worker
64*6777b538SAndroid Build Coastguard Worker delayed_task_handle_delegate_->SetHeapHandle(heap_handle);
65*6777b538SAndroid Build Coastguard Worker }
66*6777b538SAndroid Build Coastguard Worker
ClearHeapHandle()67*6777b538SAndroid Build Coastguard Worker void Task::ClearHeapHandle() {
68*6777b538SAndroid Build Coastguard Worker if (!delayed_task_handle_delegate_)
69*6777b538SAndroid Build Coastguard Worker return;
70*6777b538SAndroid Build Coastguard Worker delayed_task_handle_delegate_->ClearHeapHandle();
71*6777b538SAndroid Build Coastguard Worker }
72*6777b538SAndroid Build Coastguard Worker
GetHeapHandle() const73*6777b538SAndroid Build Coastguard Worker HeapHandle Task::GetHeapHandle() const {
74*6777b538SAndroid Build Coastguard Worker if (!delayed_task_handle_delegate_)
75*6777b538SAndroid Build Coastguard Worker return HeapHandle::Invalid();
76*6777b538SAndroid Build Coastguard Worker return delayed_task_handle_delegate_->GetHeapHandle();
77*6777b538SAndroid Build Coastguard Worker }
78*6777b538SAndroid Build Coastguard Worker
IsCanceled() const79*6777b538SAndroid Build Coastguard Worker bool Task::IsCanceled() const {
80*6777b538SAndroid Build Coastguard Worker CHECK(task);
81*6777b538SAndroid Build Coastguard Worker if (task.IsCancelled()) {
82*6777b538SAndroid Build Coastguard Worker DCHECK(!delayed_task_handle_delegate_);
83*6777b538SAndroid Build Coastguard Worker return true;
84*6777b538SAndroid Build Coastguard Worker }
85*6777b538SAndroid Build Coastguard Worker
86*6777b538SAndroid Build Coastguard Worker return delayed_task_handle_delegate_.WasInvalidated();
87*6777b538SAndroid Build Coastguard Worker }
88*6777b538SAndroid Build Coastguard Worker
WillRunTask()89*6777b538SAndroid Build Coastguard Worker bool Task::WillRunTask() {
90*6777b538SAndroid Build Coastguard Worker if (delayed_task_handle_delegate_.WasInvalidated()) {
91*6777b538SAndroid Build Coastguard Worker return false;
92*6777b538SAndroid Build Coastguard Worker }
93*6777b538SAndroid Build Coastguard Worker if (delayed_task_handle_delegate_) {
94*6777b538SAndroid Build Coastguard Worker delayed_task_handle_delegate_->WillRunTask();
95*6777b538SAndroid Build Coastguard Worker }
96*6777b538SAndroid Build Coastguard Worker return true;
97*6777b538SAndroid Build Coastguard Worker }
98*6777b538SAndroid Build Coastguard Worker
earliest_time() const99*6777b538SAndroid Build Coastguard Worker TimeTicks WakeUp::earliest_time() const {
100*6777b538SAndroid Build Coastguard Worker if (delay_policy == subtle::DelayPolicy::kFlexiblePreferEarly)
101*6777b538SAndroid Build Coastguard Worker return time - leeway;
102*6777b538SAndroid Build Coastguard Worker return time;
103*6777b538SAndroid Build Coastguard Worker }
104*6777b538SAndroid Build Coastguard Worker
latest_time() const105*6777b538SAndroid Build Coastguard Worker TimeTicks WakeUp::latest_time() const {
106*6777b538SAndroid Build Coastguard Worker if (delay_policy == subtle::DelayPolicy::kFlexibleNoSooner)
107*6777b538SAndroid Build Coastguard Worker return time + leeway;
108*6777b538SAndroid Build Coastguard Worker return time;
109*6777b538SAndroid Build Coastguard Worker }
110*6777b538SAndroid Build Coastguard Worker
111*6777b538SAndroid Build Coastguard Worker namespace internal {
PostedTask(scoped_refptr<SequencedTaskRunner> task_runner,OnceClosure callback,Location location,TimeDelta delay,Nestable nestable,TaskType task_type,WeakPtr<DelayedTaskHandleDelegate> delayed_task_handle_delegate)112*6777b538SAndroid Build Coastguard Worker PostedTask::PostedTask(
113*6777b538SAndroid Build Coastguard Worker scoped_refptr<SequencedTaskRunner> task_runner,
114*6777b538SAndroid Build Coastguard Worker OnceClosure callback,
115*6777b538SAndroid Build Coastguard Worker Location location,
116*6777b538SAndroid Build Coastguard Worker TimeDelta delay,
117*6777b538SAndroid Build Coastguard Worker Nestable nestable,
118*6777b538SAndroid Build Coastguard Worker TaskType task_type,
119*6777b538SAndroid Build Coastguard Worker WeakPtr<DelayedTaskHandleDelegate> delayed_task_handle_delegate)
120*6777b538SAndroid Build Coastguard Worker : callback(std::move(callback)),
121*6777b538SAndroid Build Coastguard Worker location(location),
122*6777b538SAndroid Build Coastguard Worker nestable(nestable),
123*6777b538SAndroid Build Coastguard Worker task_type(task_type),
124*6777b538SAndroid Build Coastguard Worker delay_or_delayed_run_time(delay),
125*6777b538SAndroid Build Coastguard Worker task_runner(std::move(task_runner)),
126*6777b538SAndroid Build Coastguard Worker delayed_task_handle_delegate(std::move(delayed_task_handle_delegate)) {}
127*6777b538SAndroid Build Coastguard Worker
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)128*6777b538SAndroid Build Coastguard Worker PostedTask::PostedTask(
129*6777b538SAndroid Build Coastguard Worker scoped_refptr<SequencedTaskRunner> task_runner,
130*6777b538SAndroid Build Coastguard Worker OnceClosure callback,
131*6777b538SAndroid Build Coastguard Worker Location location,
132*6777b538SAndroid Build Coastguard Worker TimeTicks delayed_run_time,
133*6777b538SAndroid Build Coastguard Worker subtle::DelayPolicy delay_policy,
134*6777b538SAndroid Build Coastguard Worker Nestable nestable,
135*6777b538SAndroid Build Coastguard Worker TaskType task_type,
136*6777b538SAndroid Build Coastguard Worker WeakPtr<DelayedTaskHandleDelegate> delayed_task_handle_delegate)
137*6777b538SAndroid Build Coastguard Worker : callback(std::move(callback)),
138*6777b538SAndroid Build Coastguard Worker location(location),
139*6777b538SAndroid Build Coastguard Worker nestable(nestable),
140*6777b538SAndroid Build Coastguard Worker task_type(task_type),
141*6777b538SAndroid Build Coastguard Worker delay_or_delayed_run_time(delayed_run_time),
142*6777b538SAndroid Build Coastguard Worker delay_policy(delay_policy),
143*6777b538SAndroid Build Coastguard Worker task_runner(std::move(task_runner)),
144*6777b538SAndroid Build Coastguard Worker delayed_task_handle_delegate(std::move(delayed_task_handle_delegate)) {}
145*6777b538SAndroid Build Coastguard Worker
146*6777b538SAndroid Build Coastguard Worker PostedTask::PostedTask(PostedTask&& move_from) noexcept = default;
147*6777b538SAndroid Build Coastguard Worker PostedTask::~PostedTask() = default;
148*6777b538SAndroid Build Coastguard Worker
149*6777b538SAndroid Build Coastguard Worker } // namespace internal
150*6777b538SAndroid Build Coastguard Worker } // namespace sequence_manager
151*6777b538SAndroid Build Coastguard Worker } // namespace base
152