OLD | NEW |
---|---|
(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 #include "base/timer/timer.h" | |
11 | |
12 #define MAKE_SURE_OWN_THREAD(callback, ...) \ | |
13 if (!task_runner_->BelongsToCurrentThread()) { \ | |
14 task_runner_->PostTask( \ | |
15 FROM_HERE, base::Bind(&AlarmManager::callback, \ | |
16 weak_factory_.GetWeakPtr(), ##__VA_ARGS__)); \ | |
17 return; \ | |
18 } | |
19 | |
20 namespace chromecast { | |
21 | |
22 namespace { | |
23 int kClockPollInterval = 5; | |
24 } // namespace | |
25 | |
26 AlarmManager::AlarmInfo::AlarmInfo( | |
27 const base::Closure& task, | |
28 base::Time time, | |
29 scoped_refptr<base::SingleThreadTaskRunner> task_runner) | |
30 : task_(task), time_(time), task_runner_(task_runner) {} | |
31 | |
32 AlarmManager::AlarmInfo::~AlarmInfo() {} | |
33 | |
34 AlarmManager::AlarmManager( | |
35 std::unique_ptr<base::Clock> clock, | |
36 scoped_refptr<base::SingleThreadTaskRunner> task_runner) | |
37 : clock_(std::move(clock)), task_runner_(task_runner), weak_factory_(this) { | |
38 DCHECK(task_runner.get()); | |
39 clock_tick_timer_.reset(new base::RepeatingTimer()); | |
40 clock_tick_timer_->SetTaskRunner(task_runner_); | |
41 base::TimeDelta polling_frequency = | |
42 base::TimeDelta::FromSeconds(kClockPollInterval); | |
43 clock_tick_timer_->Start( | |
44 FROM_HERE, polling_frequency, | |
45 base::Bind(&AlarmManager::CheckAlarm, weak_factory_.GetWeakPtr())); | |
46 } | |
47 | |
48 AlarmManager::AlarmManager() | |
49 : AlarmManager(base::MakeUnique<base::DefaultClock>(), | |
50 base::ThreadTaskRunnerHandle::Get()) {} | |
51 | |
52 AlarmManager::~AlarmManager() { | |
53 clock_tick_timer_.reset(nullptr); | |
halliwell
2017/02/22 19:58:55
nit: is this necessary? should be part of default
ryanchung
2017/02/22 21:36:35
Done.
| |
54 } | |
55 | |
56 void AlarmManager::PostAlarmTask(const base::Closure& task, base::Time time) { | |
57 AddAlarm(task, time, base::ThreadTaskRunnerHandle::Get()); | |
58 } | |
59 | |
60 void AlarmManager::AddAlarm( | |
61 const base::Closure& task, | |
62 base::Time time, | |
63 scoped_refptr<base::SingleThreadTaskRunner> task_runner) { | |
64 MAKE_SURE_OWN_THREAD(AddAlarm, task, time, task_runner); | |
65 std::unique_ptr<AlarmInfo> info = | |
66 base::MakeUnique<AlarmInfo>(task, time, task_runner); | |
67 next_alarm_.push(std::move(info)); | |
68 } | |
69 | |
70 void AlarmManager::CheckAlarm() { | |
71 DCHECK(task_runner_->BelongsToCurrentThread()); | |
72 base::Time now = clock_->Now(); | |
73 // Fire appropriate alarms. | |
74 while ((!next_alarm_.empty()) && now >= next_alarm_.top()->time()) { | |
75 next_alarm_.top()->task_runner()->PostTask(FROM_HERE, | |
76 next_alarm_.top()->task()); | |
77 next_alarm_.pop(); | |
78 } | |
79 } | |
80 | |
81 } // namespace chromecast | |
OLD | NEW |