• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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