xref: /aosp_15_r20/external/libchrome/base/pending_task.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_PENDING_TASK_H_
6*635a8641SAndroid Build Coastguard Worker #define BASE_PENDING_TASK_H_
7*635a8641SAndroid Build Coastguard Worker 
8*635a8641SAndroid Build Coastguard Worker #include <array>
9*635a8641SAndroid Build Coastguard Worker 
10*635a8641SAndroid Build Coastguard Worker #include "base/base_export.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/callback.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/containers/queue.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/location.h"
14*635a8641SAndroid Build Coastguard Worker #include "base/time/time.h"
15*635a8641SAndroid Build Coastguard Worker 
16*635a8641SAndroid Build Coastguard Worker namespace base {
17*635a8641SAndroid Build Coastguard Worker 
18*635a8641SAndroid Build Coastguard Worker enum class Nestable {
19*635a8641SAndroid Build Coastguard Worker   kNonNestable,
20*635a8641SAndroid Build Coastguard Worker   kNestable,
21*635a8641SAndroid Build Coastguard Worker };
22*635a8641SAndroid Build Coastguard Worker 
23*635a8641SAndroid Build Coastguard Worker // Contains data about a pending task. Stored in TaskQueue and DelayedTaskQueue
24*635a8641SAndroid Build Coastguard Worker // for use by classes that queue and execute tasks.
25*635a8641SAndroid Build Coastguard Worker struct BASE_EXPORT PendingTask {
26*635a8641SAndroid Build Coastguard Worker   PendingTask(const Location& posted_from,
27*635a8641SAndroid Build Coastguard Worker               OnceClosure task,
28*635a8641SAndroid Build Coastguard Worker               TimeTicks delayed_run_time = TimeTicks(),
29*635a8641SAndroid Build Coastguard Worker               Nestable nestable = Nestable::kNestable);
30*635a8641SAndroid Build Coastguard Worker   PendingTask(PendingTask&& other);
31*635a8641SAndroid Build Coastguard Worker   ~PendingTask();
32*635a8641SAndroid Build Coastguard Worker 
33*635a8641SAndroid Build Coastguard Worker   PendingTask& operator=(PendingTask&& other);
34*635a8641SAndroid Build Coastguard Worker 
35*635a8641SAndroid Build Coastguard Worker   // Used to support sorting.
36*635a8641SAndroid Build Coastguard Worker   bool operator<(const PendingTask& other) const;
37*635a8641SAndroid Build Coastguard Worker 
38*635a8641SAndroid Build Coastguard Worker   // The task to run.
39*635a8641SAndroid Build Coastguard Worker   OnceClosure task;
40*635a8641SAndroid Build Coastguard Worker 
41*635a8641SAndroid Build Coastguard Worker   // The site this PendingTask was posted from.
42*635a8641SAndroid Build Coastguard Worker   Location posted_from;
43*635a8641SAndroid Build Coastguard Worker 
44*635a8641SAndroid Build Coastguard Worker   // The time when the task should be run.
45*635a8641SAndroid Build Coastguard Worker   base::TimeTicks delayed_run_time;
46*635a8641SAndroid Build Coastguard Worker 
47*635a8641SAndroid Build Coastguard Worker   // Chain of up-to-four symbols of the parent tasks which led to this one being
48*635a8641SAndroid Build Coastguard Worker   // posted.
49*635a8641SAndroid Build Coastguard Worker   std::array<const void*, 4> task_backtrace = {};
50*635a8641SAndroid Build Coastguard Worker 
51*635a8641SAndroid Build Coastguard Worker   // Secondary sort key for run time.
52*635a8641SAndroid Build Coastguard Worker   int sequence_num = 0;
53*635a8641SAndroid Build Coastguard Worker 
54*635a8641SAndroid Build Coastguard Worker   // OK to dispatch from a nested loop.
55*635a8641SAndroid Build Coastguard Worker   Nestable nestable;
56*635a8641SAndroid Build Coastguard Worker 
57*635a8641SAndroid Build Coastguard Worker   // Needs high resolution timers.
58*635a8641SAndroid Build Coastguard Worker   bool is_high_res = false;
59*635a8641SAndroid Build Coastguard Worker };
60*635a8641SAndroid Build Coastguard Worker 
61*635a8641SAndroid Build Coastguard Worker using TaskQueue = base::queue<PendingTask>;
62*635a8641SAndroid Build Coastguard Worker 
63*635a8641SAndroid Build Coastguard Worker // PendingTasks are sorted by their |delayed_run_time| property.
64*635a8641SAndroid Build Coastguard Worker using DelayedTaskQueue = std::priority_queue<base::PendingTask>;
65*635a8641SAndroid Build Coastguard Worker 
66*635a8641SAndroid Build Coastguard Worker }  // namespace base
67*635a8641SAndroid Build Coastguard Worker 
68*635a8641SAndroid Build Coastguard Worker #endif  // BASE_PENDING_TASK_H_
69