1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file. 4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#ifndef COMPONENTS_DOMAIN_RELIABILITY_DISPATCHER_H_ 6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#define COMPONENTS_DOMAIN_RELIABILITY_DISPATCHER_H_ 7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <set> 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/callback_forward.h" 11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/time/time.h" 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "components/domain_reliability/domain_reliability_export.h" 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace tracked_objects { 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass Location; 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace tracked_objects 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace domain_reliability { 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class MockableTime; 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Runs tasks during a specified interval. Calling |RunEligibleTasks| gives any 23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// task a chance to run early (if the minimum delay has already passed); tasks 24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// that aren't run early will be run once their maximum delay has passed. 25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// 26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// (See scheduler.h for an explanation of how the intervals are chosen.) 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass DOMAIN_RELIABILITY_EXPORT DomainReliabilityDispatcher { 28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public: 290de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) explicit DomainReliabilityDispatcher(MockableTime* time); 30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ~DomainReliabilityDispatcher(); 31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 320de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // Schedules |task| to be executed between |min_delay| and |max_delay| from 330de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // now. The task will be run at most |max_delay| from now; once |min_delay| 340de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // has passed, any call to |RunEligibleTasks| will run the task earlier than 350de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // that. 360de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) void ScheduleTask(const base::Closure& task, 370de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) base::TimeDelta min_delay, 380de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) base::TimeDelta max_delay); 39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 400de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // Runs all tasks whose minimum delay has already passed. 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void RunEligibleTasks(); 42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private: 440de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) struct Task; 45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 460de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // Adds |task| to the set of all tasks, but not the set of eligible tasks. 47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void MakeTaskWaiting(Task* task); 480de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 490de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // Adds |task| to the set of eligible tasks, and also the set of all tasks 500de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // if not already there. 51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void MakeTaskEligible(Task* task); 520de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 530de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // Runs |task|'s callback, removes it from both sets, and deletes it. 54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void RunAndDeleteTask(Task* task); 55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch MockableTime* time_; 57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::set<Task*> tasks_; 58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::set<Task*> eligible_tasks_; 59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}; 60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace domain_reliability 62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 64