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