1*6777b538SAndroid Build Coastguard Worker // Copyright 2018 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 "base/timer/wall_clock_timer.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <utility>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include "base/power_monitor/power_monitor.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/time/clock.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/time/default_clock.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/time/default_tick_clock.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/time/tick_clock.h"
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard Worker namespace base {
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Worker WallClockTimer::WallClockTimer() = default;
WallClockTimer(const Clock * clock,const TickClock * tick_clock)18*6777b538SAndroid Build Coastguard Worker WallClockTimer::WallClockTimer(const Clock* clock, const TickClock* tick_clock)
19*6777b538SAndroid Build Coastguard Worker : timer_(tick_clock), clock_(clock ? clock : DefaultClock::GetInstance()) {}
20*6777b538SAndroid Build Coastguard Worker
~WallClockTimer()21*6777b538SAndroid Build Coastguard Worker WallClockTimer::~WallClockTimer() {
22*6777b538SAndroid Build Coastguard Worker RemoveObserver();
23*6777b538SAndroid Build Coastguard Worker }
24*6777b538SAndroid Build Coastguard Worker
Start(const Location & posted_from,Time desired_run_time,OnceClosure user_task)25*6777b538SAndroid Build Coastguard Worker void WallClockTimer::Start(const Location& posted_from,
26*6777b538SAndroid Build Coastguard Worker Time desired_run_time,
27*6777b538SAndroid Build Coastguard Worker OnceClosure user_task) {
28*6777b538SAndroid Build Coastguard Worker user_task_ = std::move(user_task);
29*6777b538SAndroid Build Coastguard Worker posted_from_ = posted_from;
30*6777b538SAndroid Build Coastguard Worker desired_run_time_ = desired_run_time;
31*6777b538SAndroid Build Coastguard Worker AddObserver();
32*6777b538SAndroid Build Coastguard Worker timer_.Start(posted_from_, desired_run_time_ - Now(), this,
33*6777b538SAndroid Build Coastguard Worker &WallClockTimer::RunUserTask);
34*6777b538SAndroid Build Coastguard Worker }
35*6777b538SAndroid Build Coastguard Worker
Stop()36*6777b538SAndroid Build Coastguard Worker void WallClockTimer::Stop() {
37*6777b538SAndroid Build Coastguard Worker timer_.Stop();
38*6777b538SAndroid Build Coastguard Worker user_task_.Reset();
39*6777b538SAndroid Build Coastguard Worker RemoveObserver();
40*6777b538SAndroid Build Coastguard Worker }
41*6777b538SAndroid Build Coastguard Worker
IsRunning() const42*6777b538SAndroid Build Coastguard Worker bool WallClockTimer::IsRunning() const {
43*6777b538SAndroid Build Coastguard Worker return timer_.IsRunning();
44*6777b538SAndroid Build Coastguard Worker }
45*6777b538SAndroid Build Coastguard Worker
OnResume()46*6777b538SAndroid Build Coastguard Worker void WallClockTimer::OnResume() {
47*6777b538SAndroid Build Coastguard Worker // This will actually restart timer with smaller delay
48*6777b538SAndroid Build Coastguard Worker timer_.Start(posted_from_, desired_run_time_ - Now(), this,
49*6777b538SAndroid Build Coastguard Worker &WallClockTimer::RunUserTask);
50*6777b538SAndroid Build Coastguard Worker }
51*6777b538SAndroid Build Coastguard Worker
AddObserver()52*6777b538SAndroid Build Coastguard Worker void WallClockTimer::AddObserver() {
53*6777b538SAndroid Build Coastguard Worker if (!observer_added_) {
54*6777b538SAndroid Build Coastguard Worker PowerMonitor::AddPowerSuspendObserver(this);
55*6777b538SAndroid Build Coastguard Worker observer_added_ = true;
56*6777b538SAndroid Build Coastguard Worker }
57*6777b538SAndroid Build Coastguard Worker }
58*6777b538SAndroid Build Coastguard Worker
RemoveObserver()59*6777b538SAndroid Build Coastguard Worker void WallClockTimer::RemoveObserver() {
60*6777b538SAndroid Build Coastguard Worker if (observer_added_) {
61*6777b538SAndroid Build Coastguard Worker PowerMonitor::RemovePowerSuspendObserver(this);
62*6777b538SAndroid Build Coastguard Worker observer_added_ = false;
63*6777b538SAndroid Build Coastguard Worker }
64*6777b538SAndroid Build Coastguard Worker }
65*6777b538SAndroid Build Coastguard Worker
RunUserTask()66*6777b538SAndroid Build Coastguard Worker void WallClockTimer::RunUserTask() {
67*6777b538SAndroid Build Coastguard Worker DCHECK(user_task_);
68*6777b538SAndroid Build Coastguard Worker RemoveObserver();
69*6777b538SAndroid Build Coastguard Worker std::exchange(user_task_, {}).Run();
70*6777b538SAndroid Build Coastguard Worker }
71*6777b538SAndroid Build Coastguard Worker
Now() const72*6777b538SAndroid Build Coastguard Worker Time WallClockTimer::Now() const {
73*6777b538SAndroid Build Coastguard Worker return clock_->Now();
74*6777b538SAndroid Build Coastguard Worker }
75*6777b538SAndroid Build Coastguard Worker
76*6777b538SAndroid Build Coastguard Worker } // namespace base
77