blob: 65dd6a33aa78f00f5e9931e99d65063dd247f9f5 [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.
#include "components/metrics/metrics_scheduler.h"
#include "build/build_config.h"
#if defined(STARBOARD)
#include "base/command_line.h"
#include "base/logging.h"
#include "base/strings/string_number_conversions.h"
#include "components/metrics/metrics_switches.h"
#endif
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
// In Cobalt, we need a command line argument to override the initial upload
// interval for testing.
#if defined(STARBOARD)
MetricsScheduler::MetricsScheduler(const base::Closure& task_callback)
: task_callback_(task_callback), running_(false), callback_pending_(false) {
const base::CommandLine* command_line =
base::CommandLine::ForCurrentProcess();
if (command_line->HasSwitch(switches::kInitialMetricsUploadIntervalSec)) {
int custom_initial_upload_interval = -1;
if (base::StringToInt(command_line->GetSwitchValueASCII(
switches::kInitialMetricsUploadIntervalSec),
&custom_initial_upload_interval)) {
interval_ = base::TimeDelta::FromSeconds(custom_initial_upload_interval);
LOG(INFO) << "Initial upload interval overriden on the command line to: "
<< custom_initial_upload_interval;
} else {
interval_ = base::TimeDelta::FromSeconds(kInitialIntervalSeconds);
LOG(WARNING)
<< "Initial upload interval was set on the command line, but "
"converting it to an int failed. Falling back to the default: "
<< kInitialIntervalSeconds;
}
} else {
interval_ = base::TimeDelta::FromSeconds(kInitialIntervalSeconds);
}
}
#else
MetricsScheduler::MetricsScheduler(const base::Closure& task_callback)
: task_callback_(task_callback),
interval_(base::TimeDelta::FromSeconds(kInitialIntervalSeconds)),
running_(false),
callback_pending_(false) {}
#endif
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