1 // Copyright 2011 The Chromium Authors
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/pending_task.h"
6
7 #include "base/task/task_features.h"
8
9 namespace base {
10
11 namespace {
12
13 // TODO(crbug.com/1153139): Reconcile with GetDefaultTaskLeeway() and
14 // kMinLowResolutionThresholdMs once GetDefaultTaskLeeway() == 16ms.
15 constexpr base::TimeDelta kMaxPreciseDelay = Milliseconds(32);
16
MaybeOverrideDelayPolicy(subtle::DelayPolicy delay_policy,TimeTicks queue_time,TimeTicks delayed_run_time)17 subtle::DelayPolicy MaybeOverrideDelayPolicy(subtle::DelayPolicy delay_policy,
18 TimeTicks queue_time,
19 TimeTicks delayed_run_time) {
20 if (delayed_run_time.is_null())
21 return subtle::DelayPolicy::kFlexibleNoSooner;
22 DCHECK(!queue_time.is_null());
23 if (delayed_run_time - queue_time >= kMaxPreciseDelay &&
24 delay_policy == subtle::DelayPolicy::kPrecise) {
25 return subtle::DelayPolicy::kFlexibleNoSooner;
26 }
27 return delay_policy;
28 }
29
30 } // namespace
31
32 PendingTask::PendingTask() = default;
33
PendingTask(const Location & posted_from,OnceClosure task,TimeTicks queue_time,TimeTicks delayed_run_time,TimeDelta leeway,subtle::DelayPolicy delay_policy)34 PendingTask::PendingTask(const Location& posted_from,
35 OnceClosure task,
36 TimeTicks queue_time,
37 TimeTicks delayed_run_time,
38 TimeDelta leeway,
39 subtle::DelayPolicy delay_policy)
40 : task(std::move(task)),
41 posted_from(posted_from),
42 queue_time(queue_time),
43 delayed_run_time(delayed_run_time),
44 leeway(leeway),
45 delay_policy(MaybeOverrideDelayPolicy(delay_policy,
46 queue_time,
47 delayed_run_time)) {}
48
49 PendingTask::PendingTask(PendingTask&& other) = default;
50
51 PendingTask::~PendingTask() = default;
52
53 PendingTask& PendingTask::operator=(PendingTask&& other) = default;
54
GetDesiredExecutionTime() const55 TimeTicks PendingTask::GetDesiredExecutionTime() const {
56 if (!delayed_run_time.is_null())
57 return delayed_run_time;
58 return queue_time;
59 }
60
earliest_delayed_run_time() const61 TimeTicks PendingTask::earliest_delayed_run_time() const {
62 DCHECK(!delayed_run_time.is_null());
63 if (delay_policy == subtle::DelayPolicy::kFlexiblePreferEarly)
64 return delayed_run_time - leeway;
65 return delayed_run_time;
66 }
67
latest_delayed_run_time() const68 TimeTicks PendingTask::latest_delayed_run_time() const {
69 DCHECK(!delayed_run_time.is_null());
70 if (delay_policy == subtle::DelayPolicy::kFlexibleNoSooner)
71 return delayed_run_time + leeway;
72 return delayed_run_time;
73 }
74
75 } // namespace base
76