blob: 1df547480740aa3aa818b0ba7a55311734711cec [file] [log] [blame]
Avi Drissmane4622aa2022-09-08 20:36:061// Copyright 2011 The Chromium Authors
[email protected]dd1f9fe2011-11-15 23:36:302// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
danakj0a448602015-03-10 00:31:165#ifndef BASE_PENDING_TASK_H_
6#define BASE_PENDING_TASK_H_
[email protected]dd1f9fe2011-11-15 23:36:307
ajwong4f13f742017-02-09 23:52:408#include <array>
[email protected]dd1f9fe2011-11-15 23:36:309
[email protected]c360bae72011-11-18 06:08:0210#include "base/base_export.h"
[email protected]dd1f9fe2011-11-15 23:36:3011#include "base/callback.h"
12#include "base/location.h"
Etienne Pierre-doray6fcfc7872022-04-26 15:56:0013#include "base/task/delay_policy.h"
[email protected]8f9a3a52013-06-28 15:14:1814#include "base/time/time.h"
[email protected]dd1f9fe2011-11-15 23:36:3015
16namespace base {
17
Alex Clarke1ac1f982019-03-29 08:48:3718enum class Nestable : uint8_t {
Hajime Hoshi64853ef2017-10-11 12:56:0719 kNonNestable,
20 kNestable,
21};
22
[email protected]dd1f9fe2011-11-15 23:36:3023// Contains data about a pending task. Stored in TaskQueue and DelayedTaskQueue
24// for use by classes that queue and execute tasks.
Brett Wilsonb57e3dd2017-09-08 00:47:4925struct BASE_EXPORT PendingTask {
Jesse McKenna9cf11372018-11-01 19:38:3826 PendingTask();
Brett Wilson8e88b312017-09-12 05:22:1627 PendingTask(const Location& posted_from,
tzik739ffe32016-10-14 14:34:5828 OnceClosure task,
Etienne Pierre-doray6fcfc7872022-04-26 15:56:0029 TimeTicks queue_time = TimeTicks(),
30 TimeTicks delayed_run_time = TimeTicks(),
31 TimeDelta leeway = TimeDelta(),
32 subtle::DelayPolicy delay_policy =
33 subtle::DelayPolicy::kFlexibleNoSooner);
tzikb6769d52016-07-07 20:20:0634 PendingTask(PendingTask&& other);
[email protected]dd1f9fe2011-11-15 23:36:3035 ~PendingTask();
36
tzikb6769d52016-07-07 20:20:0637 PendingTask& operator=(PendingTask&& other);
38
Etienne Pierre-doray69f30c82021-04-27 20:50:3739 // Returns the time at which this task should run. This is |delayed_run_time|
40 // for a delayed task, |queue_time| otherwise.
41 base::TimeTicks GetDesiredExecutionTime() const;
42
Etienne Pierre-doray6fcfc7872022-04-26 15:56:0043 TimeTicks earliest_delayed_run_time() const;
44 TimeTicks latest_delayed_run_time() const;
45
[email protected]dd1f9fe2011-11-15 23:36:3046 // The task to run.
tzik739ffe32016-10-14 14:34:5847 OnceClosure task;
[email protected]dd1f9fe2011-11-15 23:36:3048
49 // The site this PendingTask was posted from.
Brett Wilson8e88b312017-09-12 05:22:1650 Location posted_from;
[email protected]dd1f9fe2011-11-15 23:36:3051
Etienne Pierre-doray69f30c82021-04-27 20:50:3752 // The time at which the task was queued, which happens at post time. For
53 // deferred non-nestable tasks, this is reset when the nested loop exits and
54 // the deferred tasks are pushed back at the front of the queue. This is not
55 // set for immediate SequenceManager tasks unless SetAddQueueTimeToTasks(true)
56 // was called. This defaults to a null TimeTicks if the task hasn't been
57 // inserted in a sequence yet.
58 TimeTicks queue_time;
59
Francois Doray118223f42019-12-04 17:00:2860 // The time when the task should be run. This is null for an immediate task.
Brett Wilsonb57e3dd2017-09-08 00:47:4961 base::TimeTicks delayed_run_time;
62
Etienne Pierre-doray6fcfc7872022-04-26 15:56:0063 // |leeway| and |delay_policy| determine the preferred time range for running
64 // the delayed task. A larger leeway provides more freedom to run the task at
65 // an optimal time for power consumption. These fields are ignored for an
66 // immediate (non-delayed) task.
67 TimeDelta leeway;
68 subtle::DelayPolicy delay_policy = subtle::DelayPolicy::kFlexibleNoSooner;
69
Alan Cutter9b0e1ab2019-03-21 04:22:1670 // Chain of symbols of the parent tasks which led to this one being posted.
71 static constexpr size_t kTaskBacktraceLength = 4;
72 std::array<const void*, kTaskBacktraceLength> task_backtrace = {};
ajwong4f13f742017-02-09 23:52:4073
Chris Hamilton60dcc26b2019-04-24 16:59:5174 // The context of the IPC message that was being handled when this task was
Chris Hamilton888085312019-05-30 00:53:3075 // posted. This is a hash of the IPC message name that is set within the scope
76 // of an IPC handler and when symbolized uniquely identifies the message being
Harkiran Bolaria875dd0d2020-09-15 18:10:4677 // processed. This property is not propagated from one PendingTask to the
Chris Hamilton60dcc26b2019-04-24 16:59:5178 // next. For example, if pending task A was posted while handling an IPC,
79 // and pending task B was posted from within pending task A, then pending task
Harkiran Bolaria875dd0d2020-09-15 18:10:4680 // B will not inherit the |ipc_hash| of pending task A.
Chris Hamilton888085312019-05-30 00:53:3081 uint32_t ipc_hash = 0;
Harkiran Bolaria875dd0d2020-09-15 18:10:4682 const char* ipc_interface_name = nullptr;
Chris Hamilton60dcc26b2019-04-24 16:59:5183
[email protected]dd1f9fe2011-11-15 23:36:3084 // Secondary sort key for run time.
Gabriel Charetteae4f9ce2018-04-05 19:00:0185 int sequence_num = 0;
[email protected]dd1f9fe2011-11-15 23:36:3086
Alex Clarke1ac1f982019-03-29 08:48:3787 bool task_backtrace_overflow = false;
[email protected]dd1f9fe2011-11-15 23:36:3088};
89
[email protected]dd1f9fe2011-11-15 23:36:3090} // namespace base
91
danakj0a448602015-03-10 00:31:1692#endif // BASE_PENDING_TASK_H_