| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_METRICS_METRICS_SCHEDULER_H_ |
| #define COMPONENTS_METRICS_METRICS_SCHEDULER_H_ |
| |
| #include "base/callback.h" |
| #include "base/macros.h" |
| #include "base/time/time.h" |
| #include "base/timer/timer.h" |
| |
| namespace metrics { |
| |
| // Scheduler task to drive a MetricsService object's uploading. |
| class MetricsScheduler { |
| public: |
| // Creates MetricsScheduler object with the given |task_callback| |
| // callback to call when a task should happen. |
| explicit MetricsScheduler(const base::Closure& task_callback); |
| virtual ~MetricsScheduler(); |
| |
| // Starts scheduling uploads. This in a no-op if the scheduler is already |
| // running, so it is safe to call more than once. |
| void Start(); |
| |
| // Stops scheduling uploads. |
| void Stop(); |
| |
| protected: |
| // Subclasses should provide task_callback with a wrapper to call this with. |
| // This indicates the triggered task was completed/cancelled and the next |
| // call can be scheduled. |
| void TaskDone(base::TimeDelta next_interval); |
| |
| // Called by the Timer when it's time to run the task. |
| virtual void TriggerTask(); |
| |
| private: |
| // Schedules a future call to TriggerTask if one isn't already pending. |
| void ScheduleNextTask(); |
| |
| // The method to call when task should happen. |
| const base::Closure task_callback_; |
| |
| // Uses a one-shot timer rather than a repeating one because the task may be |
| // async, and the length of the interval may change. |
| base::OneShotTimer timer_; |
| |
| // The interval between being told an task is done and starting the next task. |
| base::TimeDelta interval_; |
| |
| // Indicates that the scheduler is running (i.e., that Start has been called |
| // more recently than Stop). |
| bool running_; |
| |
| // Indicates that the last triggered task hasn't resolved yet. |
| bool callback_pending_; |
| |
| DISALLOW_COPY_AND_ASSIGN(MetricsScheduler); |
| }; |
| |
| } // namespace metrics |
| |
| #endif // COMPONENTS_METRICS_METRICS_SCHEDULER_H_ |