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