Chromium Code Reviews| Index: components/scheduler/base/real_time_domain.cc |
| diff --git a/components/scheduler/base/real_time_domain.cc b/components/scheduler/base/real_time_domain.cc |
| index 8a57a0415cf3181d1d2117a587b3c7009459417e..4d3bfc7d30043eee8e678740e16e694e3e24f4de 100644 |
| --- a/components/scheduler/base/real_time_domain.cc |
| +++ b/components/scheduler/base/real_time_domain.cc |
| @@ -10,29 +10,58 @@ |
| namespace scheduler { |
| -RealTimeDomain::RealTimeDomain( |
| +RealTimeDomain::RealTimeDomain() {} |
| + |
| +RealTimeDomain::~RealTimeDomain() {} |
| + |
| +void RealTimeDomain::OnRegisterWithTaskQueueManager( |
| TaskQueueManagerDelegate* task_queue_manager_delegate, |
| - base::Closure do_work_closure) |
| - : task_queue_manager_delegate_(task_queue_manager_delegate), |
| - do_work_closure_(do_work_closure) { |
| + base::Closure do_work_closure) { |
| + task_queue_manager_delegate_ = task_queue_manager_delegate; |
| + do_work_closure_ = do_work_closure; |
| DCHECK(task_queue_manager_delegate_); |
| } |
| -RealTimeDomain::~RealTimeDomain() {} |
| - |
| LazyNow RealTimeDomain::CreateLazyNow() { |
| + DCHECK(task_queue_manager_delegate_); |
| return LazyNow(task_queue_manager_delegate_); |
| } |
| -void RealTimeDomain::RequestWakeup(base::TimeDelta delay) { |
| - task_queue_manager_delegate_->PostDelayedTask(FROM_HERE, do_work_closure_, |
| - delay); |
| +void RealTimeDomain::RequestWakeup(LazyNow* lazy_now, base::TimeDelta delay) { |
| + PostWrappedDoWork(lazy_now->Now(), lazy_now->Now() + delay); |
| } |
| bool RealTimeDomain::MaybeAdvanceTime() { |
| + base::TimeTicks next_run_time; |
| + if (!NextScheduledRunTime(&next_run_time)) |
| + return false; |
| + |
| + DCHECK(task_queue_manager_delegate_); |
| + base::TimeTicks now = task_queue_manager_delegate_->NowTicks(); |
| + if (now >= next_run_time) |
| + return true; |
| + |
| + PostWrappedDoWork(now, next_run_time); |
| return false; |
| } |
| +void RealTimeDomain::PostWrappedDoWork(base::TimeTicks now, |
| + base::TimeTicks run_time) { |
| + DCHECK_GE(run_time, now); |
| + DCHECK(task_queue_manager_delegate_); |
| + if (pending_wakeups_.insert(run_time).second) { |
| + task_queue_manager_delegate_->PostDelayedTask( |
| + FROM_HERE, |
| + base::Bind(&RealTimeDomain::WrappedDoWorkTask, this, run_time), |
|
Sami
2015/11/20 19:20:00
I think this might need to be a weak pointer to gu
alex clarke (OOO till 29th)
2015/11/23 10:11:51
Done.
|
| + run_time - now); |
| + } |
| +} |
| + |
| +void RealTimeDomain::WrappedDoWorkTask(base::TimeTicks run_time) { |
| + pending_wakeups_.erase(run_time); |
| + do_work_closure_.Run(); |
| +} |
| + |
| void RealTimeDomain::AsValueIntoInternal( |
| base::trace_event::TracedValue* state) const {} |