| // 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. |
| |
| #include "components/metrics/metrics_scheduler.h" |
| |
| #include "build/build_config.h" |
| |
| namespace metrics { |
| |
| namespace { |
| |
| // The delay, in seconds, after startup before sending the first log message. |
| #if defined(OS_ANDROID) || defined(OS_IOS) |
| // Sessions are more likely to be short on a mobile device, so handle the |
| // initial log quickly. |
| const int kInitialIntervalSeconds = 15; |
| #else |
| const int kInitialIntervalSeconds = 60; |
| #endif |
| |
| } // namespace |
| |
| MetricsScheduler::MetricsScheduler(const base::Closure& task_callback) |
| : task_callback_(task_callback), |
| interval_(base::TimeDelta::FromSeconds(kInitialIntervalSeconds)), |
| running_(false), |
| callback_pending_(false) {} |
| |
| MetricsScheduler::~MetricsScheduler() {} |
| |
| void MetricsScheduler::Start() { |
| running_ = true; |
| ScheduleNextTask(); |
| } |
| |
| void MetricsScheduler::Stop() { |
| running_ = false; |
| if (timer_.IsRunning()) |
| timer_.Stop(); |
| } |
| |
| void MetricsScheduler::TaskDone(base::TimeDelta next_interval) { |
| DCHECK(callback_pending_); |
| callback_pending_ = false; |
| interval_ = next_interval; |
| if (running_) |
| ScheduleNextTask(); |
| } |
| |
| void MetricsScheduler::TriggerTask() { |
| callback_pending_ = true; |
| task_callback_.Run(); |
| } |
| |
| void MetricsScheduler::ScheduleNextTask() { |
| DCHECK(running_); |
| if (timer_.IsRunning() || callback_pending_) |
| return; |
| |
| timer_.Start(FROM_HERE, interval_, this, &MetricsScheduler::TriggerTask); |
| } |
| |
| } // namespace metrics |