| // 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_rotation_scheduler.h" |
| |
| #include "base/metrics/histogram_macros.h" |
| #include "build/build_config.h" |
| |
| namespace metrics { |
| |
| MetricsRotationScheduler::MetricsRotationScheduler( |
| const base::Closure& upload_callback, |
| const base::Callback<base::TimeDelta(void)>& upload_interval_callback) |
| : MetricsScheduler(upload_callback), |
| init_task_complete_(false), |
| waiting_for_init_task_complete_(false), |
| upload_interval_callback_(upload_interval_callback) {} |
| |
| MetricsRotationScheduler::~MetricsRotationScheduler() {} |
| |
| void MetricsRotationScheduler::InitTaskComplete() { |
| DCHECK(!init_task_complete_); |
| init_task_complete_ = true; |
| if (waiting_for_init_task_complete_) { |
| waiting_for_init_task_complete_ = false; |
| TriggerTask(); |
| } else { |
| LogMetricsInitSequence(INIT_TASK_COMPLETED_FIRST); |
| } |
| } |
| |
| void MetricsRotationScheduler::RotationFinished() { |
| TaskDone(upload_interval_callback_.Run()); |
| } |
| |
| void MetricsRotationScheduler::LogMetricsInitSequence(InitSequence sequence) { |
| UMA_HISTOGRAM_ENUMERATION("UMA.InitSequence", sequence, |
| INIT_SEQUENCE_ENUM_SIZE); |
| } |
| |
| void MetricsRotationScheduler::TriggerTask() { |
| // If the timer fired before the init task has completed, don't trigger the |
| // upload yet - wait for the init task to complete and do it then. |
| if (!init_task_complete_) { |
| LogMetricsInitSequence(TIMER_FIRED_FIRST); |
| waiting_for_init_task_complete_ = true; |
| return; |
| } |
| MetricsScheduler::TriggerTask(); |
| } |
| |
| } // namespace metrics |