// 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