Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(530)

Side by Side Diff: chromecast/base/alarm_manager.cc

Issue 2695223008: [Chromecast] Add an alarm manager for firing events on wall clock time. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chromecast/base/alarm_manager.h"
6
7 #include "base/memory/ptr_util.h"
8 #include "base/threading/thread_task_runner_handle.h"
9 #include "base/time/default_clock.h"
10
11 namespace chromecast {
12
13 namespace {
14 // How often to poll the clock.
15 int kClockPollInterval = 5;
16 } // namespace
17
18 // AlarmInfo is for recording the time and task runner for the alarm.
19 AlarmManager::AlarmInfo::AlarmInfo(
20 base::Time time,
21 scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
22 time_ = time;
23 task_runner_ = task_runner;
24 }
25
26 AlarmManager::AlarmInfo::~AlarmInfo() {}
27
28 AlarmManager::AlarmManager(std::unique_ptr<base::Clock> clock)
29 : clock_(std::move(clock)), weak_factory_(this) {
30 Start();
31 }
32
33 AlarmManager::AlarmManager()
34 : clock_(new base::DefaultClock()), weak_factory_(this) {
35 Start();
36 }
37
38 AlarmManager::~AlarmManager() {
39 Stop();
40 }
41
42 void AlarmManager::Start() {
43 clock_tick_timer_.reset(new base::RepeatingTimer());
44 base::TimeDelta polling_frequency =
45 base::TimeDelta::FromSeconds(kClockPollInterval);
46 clock_tick_timer_->Start(
47 FROM_HERE, polling_frequency,
48 base::Bind(&AlarmManager::CheckAlarm, weak_factory_.GetWeakPtr()));
49 }
50
51 void AlarmManager::Stop() {
52 clock_tick_timer_.reset(nullptr);
53 }
54
55 void AlarmManager::AddAlarm(AlarmDelegate* delegate, base::Time time) {
56 base::AutoLock lock(alarms_lock_);
57 next_alarm_.push(time);
58 std::unique_ptr<AlarmInfo> info =
59 base::MakeUnique<AlarmInfo>(time, base::ThreadTaskRunnerHandle::Get());
60 alarms_[delegate] = std::move(info);
61 }
62 void AlarmManager::RemoveAlarm(AlarmDelegate* delegate) {
63 base::AutoLock lock(alarms_lock_);
64 alarms_.erase(delegate);
65 }
66
67 void AlarmManager::CheckAlarm() {
68 base::AutoLock lock(alarms_lock_);
69 base::Time now = clock_->Now();
70 if (next_alarm_.empty() || now < next_alarm_.top()) {
71 return;
72 }
73
74 // An alarm should fire.
75 while ((!next_alarm_.empty()) && now >= next_alarm_.top()) {
76 // Clear all the elapsed dates.
77 next_alarm_.pop();
78 }
79
80 // Fire appropriate alarms.
81 for (auto alarm = alarms_.begin(); alarm != alarms_.end();) {
82 if (now >= alarm->second->time_) {
83 alarm->second->task_runner_->PostTask(
84 FROM_HERE, base::Bind(&AlarmDelegate::OnAlarmFire,
85 base::Unretained(alarm->first)));
86 alarm = alarms_.erase(alarm);
87 } else {
88 ++alarm;
89 }
90 }
91 }
92
93 } // chromecast
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698