blob: fc031fb8ddc09c6359ba498d606706f9f6c9ae7f [file] [log] [blame]
// 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_