xref: /aosp_15_r20/external/cronet/components/metrics/metrics_scheduler.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "components/metrics/metrics_scheduler.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker namespace metrics {
10*6777b538SAndroid Build Coastguard Worker namespace {
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker // The delay, in seconds, after startup before sending the first log message.
13*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
14*6777b538SAndroid Build Coastguard Worker // Sessions are more likely to be short on a mobile device, so handle the
15*6777b538SAndroid Build Coastguard Worker // initial log quickly.
16*6777b538SAndroid Build Coastguard Worker const int kInitialIntervalSeconds = 15;
17*6777b538SAndroid Build Coastguard Worker #else
18*6777b538SAndroid Build Coastguard Worker const int kInitialIntervalSeconds = 60;
19*6777b538SAndroid Build Coastguard Worker #endif
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker }  // namespace
22*6777b538SAndroid Build Coastguard Worker 
MetricsScheduler(const base::RepeatingClosure & task_callback,bool fast_startup_for_testing)23*6777b538SAndroid Build Coastguard Worker MetricsScheduler::MetricsScheduler(const base::RepeatingClosure& task_callback,
24*6777b538SAndroid Build Coastguard Worker                                    bool fast_startup_for_testing)
25*6777b538SAndroid Build Coastguard Worker     : task_callback_(task_callback),
26*6777b538SAndroid Build Coastguard Worker       interval_(base::Seconds(
27*6777b538SAndroid Build Coastguard Worker           fast_startup_for_testing ? 0 : kInitialIntervalSeconds)),
28*6777b538SAndroid Build Coastguard Worker       running_(false),
29*6777b538SAndroid Build Coastguard Worker       callback_pending_(false) {}
30*6777b538SAndroid Build Coastguard Worker 
~MetricsScheduler()31*6777b538SAndroid Build Coastguard Worker MetricsScheduler::~MetricsScheduler() {}
32*6777b538SAndroid Build Coastguard Worker 
Start()33*6777b538SAndroid Build Coastguard Worker void MetricsScheduler::Start() {
34*6777b538SAndroid Build Coastguard Worker   running_ = true;
35*6777b538SAndroid Build Coastguard Worker   ScheduleNextTask();
36*6777b538SAndroid Build Coastguard Worker }
37*6777b538SAndroid Build Coastguard Worker 
Stop()38*6777b538SAndroid Build Coastguard Worker void MetricsScheduler::Stop() {
39*6777b538SAndroid Build Coastguard Worker   running_ = false;
40*6777b538SAndroid Build Coastguard Worker   if (timer_.IsRunning())
41*6777b538SAndroid Build Coastguard Worker     timer_.Stop();
42*6777b538SAndroid Build Coastguard Worker }
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker // static
GetInitialIntervalSeconds()45*6777b538SAndroid Build Coastguard Worker int MetricsScheduler::GetInitialIntervalSeconds() {
46*6777b538SAndroid Build Coastguard Worker   return kInitialIntervalSeconds;
47*6777b538SAndroid Build Coastguard Worker }
48*6777b538SAndroid Build Coastguard Worker 
TaskDone(base::TimeDelta next_interval)49*6777b538SAndroid Build Coastguard Worker void MetricsScheduler::TaskDone(base::TimeDelta next_interval) {
50*6777b538SAndroid Build Coastguard Worker   DCHECK(callback_pending_);
51*6777b538SAndroid Build Coastguard Worker   callback_pending_ = false;
52*6777b538SAndroid Build Coastguard Worker   interval_ = next_interval;
53*6777b538SAndroid Build Coastguard Worker   if (running_)
54*6777b538SAndroid Build Coastguard Worker     ScheduleNextTask();
55*6777b538SAndroid Build Coastguard Worker }
56*6777b538SAndroid Build Coastguard Worker 
TriggerTask()57*6777b538SAndroid Build Coastguard Worker void MetricsScheduler::TriggerTask() {
58*6777b538SAndroid Build Coastguard Worker   // This can happen in tests which set a very small timer interval.
59*6777b538SAndroid Build Coastguard Worker   if (callback_pending_)
60*6777b538SAndroid Build Coastguard Worker     return;
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker   callback_pending_ = true;
63*6777b538SAndroid Build Coastguard Worker   task_callback_.Run();
64*6777b538SAndroid Build Coastguard Worker }
65*6777b538SAndroid Build Coastguard Worker 
ScheduleNextTask()66*6777b538SAndroid Build Coastguard Worker void MetricsScheduler::ScheduleNextTask() {
67*6777b538SAndroid Build Coastguard Worker   DCHECK(running_);
68*6777b538SAndroid Build Coastguard Worker   if (timer_.IsRunning() || callback_pending_)
69*6777b538SAndroid Build Coastguard Worker     return;
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker   timer_.Start(FROM_HERE, interval_, this, &MetricsScheduler::TriggerTask);
72*6777b538SAndroid Build Coastguard Worker }
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker }  // namespace metrics
75