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 |
| 54 void AlarmManager::PostAlarmTask(const base::Closure& task, base::Time time) { |
| 55 AddAlarm(task, time, base::ThreadTaskRunnerHandle::Get()); |
| 56 } |
| 57 |
| 58 void AlarmManager::AddAlarm( |
| 59 const base::Closure& task, |
| 60 base::Time time, |
| 61 scoped_refptr<base::SingleThreadTaskRunner> task_runner) { |
| 62 MAKE_SURE_OWN_THREAD(AddAlarm, task, time, task_runner); |
| 63 std::unique_ptr<AlarmInfo> info = |
| 64 base::MakeUnique<AlarmInfo>(task, time, task_runner); |
| 65 next_alarm_.push(std::move(info)); |
| 66 } |
| 67 |
| 68 void AlarmManager::CheckAlarm() { |
| 69 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 70 base::Time now = clock_->Now(); |
| 71 // Fire appropriate alarms. |
| 72 while ((!next_alarm_.empty()) && now >= next_alarm_.top()->time()) { |
| 73 next_alarm_.top()->task_runner()->PostTask(FROM_HERE, |
| 74 next_alarm_.top()->task()); |
| 75 next_alarm_.pop(); |
| 76 } |
| 77 } |
| 78 |
| 79 } // namespace chromecast |
OLD | NEW |