xref: /aosp_15_r20/external/cronet/base/pending_task.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 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 #ifndef BASE_PENDING_TASK_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_PENDING_TASK_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <array>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/location.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/task/delay_policy.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker namespace base {
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker enum class Nestable : uint8_t {
19*6777b538SAndroid Build Coastguard Worker   kNonNestable,
20*6777b538SAndroid Build Coastguard Worker   kNestable,
21*6777b538SAndroid Build Coastguard Worker };
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker // Copyable data part of PendingTask.
24*6777b538SAndroid Build Coastguard Worker struct BASE_EXPORT TaskMetadata {
25*6777b538SAndroid Build Coastguard Worker   TaskMetadata();
26*6777b538SAndroid Build Coastguard Worker   explicit TaskMetadata(const Location& posted_from,
27*6777b538SAndroid Build Coastguard Worker                         TimeTicks queue_time = TimeTicks(),
28*6777b538SAndroid Build Coastguard Worker                         TimeTicks delayed_run_time = TimeTicks(),
29*6777b538SAndroid Build Coastguard Worker                         TimeDelta leeway = TimeDelta(),
30*6777b538SAndroid Build Coastguard Worker                         subtle::DelayPolicy delay_policy =
31*6777b538SAndroid Build Coastguard Worker                             subtle::DelayPolicy::kFlexibleNoSooner);
32*6777b538SAndroid Build Coastguard Worker   TaskMetadata(TaskMetadata&& other);
33*6777b538SAndroid Build Coastguard Worker   TaskMetadata(const TaskMetadata& other);
34*6777b538SAndroid Build Coastguard Worker   ~TaskMetadata();
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker   TaskMetadata& operator=(TaskMetadata&& other);
37*6777b538SAndroid Build Coastguard Worker   TaskMetadata& operator=(const TaskMetadata& other);
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker   // Returns the time at which this task should run. This is |delayed_run_time|
40*6777b538SAndroid Build Coastguard Worker   // for a delayed task, |queue_time| otherwise.
41*6777b538SAndroid Build Coastguard Worker   base::TimeTicks GetDesiredExecutionTime() const;
42*6777b538SAndroid Build Coastguard Worker 
43*6777b538SAndroid Build Coastguard Worker   TimeTicks earliest_delayed_run_time() const;
44*6777b538SAndroid Build Coastguard Worker   TimeTicks latest_delayed_run_time() const;
45*6777b538SAndroid Build Coastguard Worker 
46*6777b538SAndroid Build Coastguard Worker   // The site this PendingTask was posted from.
47*6777b538SAndroid Build Coastguard Worker   Location posted_from;
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker   // The time at which the task was queued, which happens at post time. For
50*6777b538SAndroid Build Coastguard Worker   // deferred non-nestable tasks, this is reset when the nested loop exits and
51*6777b538SAndroid Build Coastguard Worker   // the deferred tasks are pushed back at the front of the queue. This is not
52*6777b538SAndroid Build Coastguard Worker   // set for immediate SequenceManager tasks unless SetAddQueueTimeToTasks(true)
53*6777b538SAndroid Build Coastguard Worker   // was called. This defaults to a null TimeTicks if the task hasn't been
54*6777b538SAndroid Build Coastguard Worker   // inserted in a sequence yet.
55*6777b538SAndroid Build Coastguard Worker   TimeTicks queue_time;
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker   // The time when the task should be run. This is null for an immediate task.
58*6777b538SAndroid Build Coastguard Worker   base::TimeTicks delayed_run_time;
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker   // |leeway| and |delay_policy| determine the preferred time range for running
61*6777b538SAndroid Build Coastguard Worker   // the delayed task. A larger leeway provides more freedom to run the task at
62*6777b538SAndroid Build Coastguard Worker   // an optimal time for power consumption. These fields are ignored for an
63*6777b538SAndroid Build Coastguard Worker   // immediate (non-delayed) task.
64*6777b538SAndroid Build Coastguard Worker   TimeDelta leeway;
65*6777b538SAndroid Build Coastguard Worker   subtle::DelayPolicy delay_policy = subtle::DelayPolicy::kFlexibleNoSooner;
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker   // Chain of symbols of the parent tasks which led to this one being posted.
68*6777b538SAndroid Build Coastguard Worker   static constexpr size_t kTaskBacktraceLength = 4;
69*6777b538SAndroid Build Coastguard Worker   std::array<const void*, kTaskBacktraceLength> task_backtrace = {};
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker   // The context of the IPC message that was being handled when this task was
72*6777b538SAndroid Build Coastguard Worker   // posted. This is a hash of the IPC message name that is set within the scope
73*6777b538SAndroid Build Coastguard Worker   // of an IPC handler and when symbolized uniquely identifies the message being
74*6777b538SAndroid Build Coastguard Worker   // processed. This property is not propagated from one PendingTask to the
75*6777b538SAndroid Build Coastguard Worker   // next. For example, if pending task A was posted while handling an IPC,
76*6777b538SAndroid Build Coastguard Worker   // and pending task B was posted from within pending task A, then pending task
77*6777b538SAndroid Build Coastguard Worker   // B will not inherit the |ipc_hash| of pending task A.
78*6777b538SAndroid Build Coastguard Worker   uint32_t ipc_hash = 0;
79*6777b538SAndroid Build Coastguard Worker   const char* ipc_interface_name = nullptr;
80*6777b538SAndroid Build Coastguard Worker 
81*6777b538SAndroid Build Coastguard Worker   // Secondary sort key for run time.
82*6777b538SAndroid Build Coastguard Worker   int sequence_num = 0;
83*6777b538SAndroid Build Coastguard Worker 
84*6777b538SAndroid Build Coastguard Worker   bool task_backtrace_overflow = false;
85*6777b538SAndroid Build Coastguard Worker };
86*6777b538SAndroid Build Coastguard Worker 
87*6777b538SAndroid Build Coastguard Worker // Contains data about a pending task. Stored in TaskQueue and DelayedTaskQueue
88*6777b538SAndroid Build Coastguard Worker // for use by classes that queue and execute tasks.
89*6777b538SAndroid Build Coastguard Worker struct BASE_EXPORT PendingTask : public TaskMetadata {
90*6777b538SAndroid Build Coastguard Worker   PendingTask();
91*6777b538SAndroid Build Coastguard Worker   PendingTask(const Location& posted_from,
92*6777b538SAndroid Build Coastguard Worker               OnceClosure task,
93*6777b538SAndroid Build Coastguard Worker               TimeTicks queue_time = TimeTicks(),
94*6777b538SAndroid Build Coastguard Worker               TimeTicks delayed_run_time = TimeTicks(),
95*6777b538SAndroid Build Coastguard Worker               TimeDelta leeway = TimeDelta(),
96*6777b538SAndroid Build Coastguard Worker               subtle::DelayPolicy delay_policy =
97*6777b538SAndroid Build Coastguard Worker                   subtle::DelayPolicy::kFlexibleNoSooner);
98*6777b538SAndroid Build Coastguard Worker   PendingTask(const TaskMetadata& metadata, OnceClosure task);
99*6777b538SAndroid Build Coastguard Worker   PendingTask(PendingTask&& other);
100*6777b538SAndroid Build Coastguard Worker   ~PendingTask();
101*6777b538SAndroid Build Coastguard Worker 
102*6777b538SAndroid Build Coastguard Worker   PendingTask& operator=(PendingTask&& other);
103*6777b538SAndroid Build Coastguard Worker 
104*6777b538SAndroid Build Coastguard Worker   // The task to run.
105*6777b538SAndroid Build Coastguard Worker   OnceClosure task;
106*6777b538SAndroid Build Coastguard Worker };
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker }  // namespace base
109*6777b538SAndroid Build Coastguard Worker 
110*6777b538SAndroid Build Coastguard Worker #endif  // BASE_PENDING_TASK_H_
111