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