OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "platform/scheduler/base/time_domain.h" | 5 #include "platform/scheduler/base/time_domain.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "platform/scheduler/base/task_queue_impl.h" | 9 #include "platform/scheduler/base/task_queue_impl.h" |
10 #include "platform/scheduler/base/task_queue_manager_delegate.h" | 10 #include "platform/scheduler/base/task_queue_manager_delegate.h" |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 delayed_run_time < delayed_wakeup_multimap_.begin()->first) { | 77 delayed_run_time < delayed_wakeup_multimap_.begin()->first) { |
78 base::TimeDelta delay = std::max(base::TimeDelta(), delayed_run_time - now); | 78 base::TimeDelta delay = std::max(base::TimeDelta(), delayed_run_time - now); |
79 RequestWakeup(now, delay); | 79 RequestWakeup(now, delay); |
80 } | 80 } |
81 | 81 |
82 delayed_wakeup_multimap_.insert(std::make_pair(delayed_run_time, queue)); | 82 delayed_wakeup_multimap_.insert(std::make_pair(delayed_run_time, queue)); |
83 if (observer_) | 83 if (observer_) |
84 observer_->OnTimeDomainHasDelayedWork(); | 84 observer_->OnTimeDomainHasDelayedWork(); |
85 } | 85 } |
86 | 86 |
| 87 void TimeDomain::CancelDelayedWork(internal::TaskQueueImpl* queue, |
| 88 base::TimeTicks delayed_run_time) { |
| 89 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 90 |
| 91 auto iterpair = delayed_wakeup_multimap_.equal_range(delayed_run_time); |
| 92 for (auto it = iterpair.first; it != iterpair.second; ++it) { |
| 93 if (it->second == queue) { |
| 94 base::TimeTicks prev_first_wakeup = |
| 95 delayed_wakeup_multimap_.begin()->first; |
| 96 delayed_wakeup_multimap_.erase(it); |
| 97 |
| 98 if (delayed_wakeup_multimap_.empty()) |
| 99 break; |
| 100 |
| 101 base::TimeTicks first_wakeup = delayed_wakeup_multimap_.begin()->first; |
| 102 |
| 103 if (first_wakeup == prev_first_wakeup) |
| 104 break; |
| 105 |
| 106 // The first wakeup has changed, we need to re-schedule. |
| 107 base::TimeTicks now = Now(); |
| 108 base::TimeDelta delay = std::max(base::TimeDelta(), first_wakeup - now); |
| 109 RequestWakeup(now, delay); |
| 110 break; |
| 111 } |
| 112 } |
| 113 |
| 114 // Note since the base TaskRunner does not support cancellation there's no |
| 115 // point trying to cancel a wakeup requested via RequestWakeup :( |
| 116 } |
| 117 |
87 void TimeDomain::RegisterAsUpdatableTaskQueue(internal::TaskQueueImpl* queue) { | 118 void TimeDomain::RegisterAsUpdatableTaskQueue(internal::TaskQueueImpl* queue) { |
88 { | 119 { |
89 base::AutoLock lock(newly_updatable_lock_); | 120 base::AutoLock lock(newly_updatable_lock_); |
90 newly_updatable_.push_back(queue); | 121 newly_updatable_.push_back(queue); |
91 } | 122 } |
92 if (observer_) | 123 if (observer_) |
93 observer_->OnTimeDomainHasImmediateWork(); | 124 observer_->OnTimeDomainHasImmediateWork(); |
94 } | 125 } |
95 | 126 |
96 bool TimeDomain::UnregisterAsUpdatableTaskQueue( | 127 bool TimeDomain::UnregisterAsUpdatableTaskQueue( |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 if (!delayed_wakeup_multimap_.empty()) { | 244 if (!delayed_wakeup_multimap_.empty()) { |
214 base::TimeDelta delay = delayed_wakeup_multimap_.begin()->first - Now(); | 245 base::TimeDelta delay = delayed_wakeup_multimap_.begin()->first - Now(); |
215 state->SetDouble("next_delay_ms", delay.InMillisecondsF()); | 246 state->SetDouble("next_delay_ms", delay.InMillisecondsF()); |
216 } | 247 } |
217 AsValueIntoInternal(state); | 248 AsValueIntoInternal(state); |
218 state->EndDictionary(); | 249 state->EndDictionary(); |
219 } | 250 } |
220 | 251 |
221 } // namespace scheduler | 252 } // namespace scheduler |
222 } // namespace blink | 253 } // namespace blink |
OLD | NEW |