15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PENDING_TASK_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PENDING_TASK_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <queue> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_export.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/tracking_info.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Contains data about a pending task. Stored in TaskQueue and DelayedTaskQueue 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for use by classes that queue and execute tasks. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct BASE_EXPORT PendingTask : public TrackingInfo { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingTask(const tracked_objects::Location& posted_from, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Closure& task); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PendingTask(const tracked_objects::Location& posted_from, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Closure& task, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TimeTicks delayed_run_time, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool nestable); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~PendingTask(); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to support sorting. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool operator<(const PendingTask& other) const; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The task to run. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure task; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The site this PendingTask was posted from. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tracked_objects::Location posted_from; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Secondary sort key for run time. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sequence_num; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // OK to dispatch from a nested loop. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool nestable; 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Needs high resolution timers. 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_high_res; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Wrapper around std::queue specialized for PendingTask which adds a Swap 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// helper method. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BASE_EXPORT TaskQueue : public std::queue<PendingTask> { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Swap(TaskQueue* queue); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PendingTasks are sorted by their |delayed_run_time| property. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::priority_queue<base::PendingTask> DelayedTaskQueue; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // PENDING_TASK_H_ 61