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 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 } | 152 } |
153 | 153 |
154 void TimeDomain::UpdateWorkQueues(LazyNow lazy_now) { | 154 void TimeDomain::UpdateWorkQueues(LazyNow lazy_now) { |
155 DCHECK(main_thread_checker_.CalledOnValidThread()); | 155 DCHECK(main_thread_checker_.CalledOnValidThread()); |
156 | 156 |
157 // Move any ready delayed tasks into the Incoming queues. | 157 // Move any ready delayed tasks into the Incoming queues. |
158 WakeupReadyDelayedQueues(&lazy_now); | 158 WakeupReadyDelayedQueues(&lazy_now); |
159 | 159 |
160 MoveNewlyUpdatableQueuesIntoUpdatableQueueSet(); | 160 MoveNewlyUpdatableQueuesIntoUpdatableQueueSet(); |
161 | 161 |
162 auto iter = updatable_queue_set_.begin(); | 162 std::set<internal::TaskQueueImpl*>::iterator iter = |
| 163 updatable_queue_set_.begin(); |
163 while (iter != updatable_queue_set_.end()) { | 164 while (iter != updatable_queue_set_.end()) { |
164 internal::TaskQueueImpl* queue = *iter++; | 165 std::set<internal::TaskQueueImpl*>::iterator queue_it = iter++; |
165 // NOTE Update work queue may erase itself from |updatable_queue_set_|. | 166 internal::TaskQueueImpl* queue = *queue_it; |
166 // This is fine, erasing an element won't invalidate any interator, as long | 167 |
167 // as the iterator isn't the element being delated. | 168 // Update the queue and remove from the set if subsequent updates are not |
168 if (queue->immediate_work_queue()->Empty()) | 169 // required. |
169 queue->UpdateImmediateWorkQueue(); | 170 if (!queue->MaybeUpdateImmediateWorkQueues()) |
| 171 updatable_queue_set_.erase(queue_it); |
170 } | 172 } |
171 } | 173 } |
172 | 174 |
173 void TimeDomain::MoveNewlyUpdatableQueuesIntoUpdatableQueueSet() { | 175 void TimeDomain::MoveNewlyUpdatableQueuesIntoUpdatableQueueSet() { |
174 DCHECK(main_thread_checker_.CalledOnValidThread()); | 176 DCHECK(main_thread_checker_.CalledOnValidThread()); |
175 base::AutoLock lock(newly_updatable_lock_); | 177 base::AutoLock lock(newly_updatable_lock_); |
176 while (!newly_updatable_.empty()) { | 178 while (!newly_updatable_.empty()) { |
177 updatable_queue_set_.insert(newly_updatable_.back()); | 179 updatable_queue_set_.insert(newly_updatable_.back()); |
178 newly_updatable_.pop_back(); | 180 newly_updatable_.pop_back(); |
179 } | 181 } |
180 } | 182 } |
181 | 183 |
182 void TimeDomain::WakeupReadyDelayedQueues(LazyNow* lazy_now) { | 184 void TimeDomain::WakeupReadyDelayedQueues(LazyNow* lazy_now) { |
183 DCHECK(main_thread_checker_.CalledOnValidThread()); | 185 DCHECK(main_thread_checker_.CalledOnValidThread()); |
184 // Wake up any queues with pending delayed work. Note std::multipmap stores | 186 // Wake up any queues with pending delayed work. Note std::multipmap stores |
185 // the elements sorted by key, so the begin() iterator points to the earliest | 187 // the elements sorted by key, so the begin() iterator points to the earliest |
186 // queue to wakeup. | 188 // queue to wakeup. |
187 std::set<internal::TaskQueueImpl*> dedup_set; | 189 std::set<internal::TaskQueueImpl*> dedup_set; |
188 while (!delayed_wakeup_multimap_.empty()) { | 190 while (!delayed_wakeup_multimap_.empty()) { |
189 DelayedWakeupMultimap::iterator next_wakeup = | 191 DelayedWakeupMultimap::iterator next_wakeup = |
190 delayed_wakeup_multimap_.begin(); | 192 delayed_wakeup_multimap_.begin(); |
191 if (next_wakeup->first > lazy_now->Now()) | 193 if (next_wakeup->first > lazy_now->Now()) |
192 break; | 194 break; |
193 // A queue could have any number of delayed tasks pending so it's worthwhile | 195 // A queue could have any number of delayed tasks pending so it's worthwhile |
194 // deduping calls to UpdateDelayedWorkQueue since it takes a lock. | 196 // deduping calls to UpdateDelayedWorkQueue since it takes a lock. |
195 // NOTE the order in which these are called matters since the order | 197 // NOTE the order in which these are called matters since the order |
196 // in which EnqueueTaskLocks is called is respected when choosing which | 198 // in which EnqueueTaskLocks is called is respected when choosing which |
197 // queue to execute a task from. | 199 // queue to execute a task from. |
198 if (dedup_set.insert(next_wakeup->second).second) { | 200 if (dedup_set.insert(next_wakeup->second).second) { |
199 next_wakeup->second->UpdateDelayedWorkQueue(lazy_now); | 201 next_wakeup->second->MoveReadyDelayedTasksToDelayedWorkQueue(lazy_now); |
200 } | 202 } |
201 delayed_wakeup_multimap_.erase(next_wakeup); | 203 delayed_wakeup_multimap_.erase(next_wakeup); |
202 } | 204 } |
203 } | 205 } |
204 | 206 |
205 void TimeDomain::ClearExpiredWakeups() { | 207 void TimeDomain::ClearExpiredWakeups() { |
206 DCHECK(main_thread_checker_.CalledOnValidThread()); | 208 DCHECK(main_thread_checker_.CalledOnValidThread()); |
207 LazyNow lazy_now(CreateLazyNow()); | 209 LazyNow lazy_now(CreateLazyNow()); |
208 while (!delayed_wakeup_multimap_.empty()) { | 210 while (!delayed_wakeup_multimap_.empty()) { |
209 DelayedWakeupMultimap::iterator next_wakeup = | 211 DelayedWakeupMultimap::iterator next_wakeup = |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 if (!delayed_wakeup_multimap_.empty()) { | 245 if (!delayed_wakeup_multimap_.empty()) { |
244 base::TimeDelta delay = delayed_wakeup_multimap_.begin()->first - Now(); | 246 base::TimeDelta delay = delayed_wakeup_multimap_.begin()->first - Now(); |
245 state->SetDouble("next_delay_ms", delay.InMillisecondsF()); | 247 state->SetDouble("next_delay_ms", delay.InMillisecondsF()); |
246 } | 248 } |
247 AsValueIntoInternal(state); | 249 AsValueIntoInternal(state); |
248 state->EndDictionary(); | 250 state->EndDictionary(); |
249 } | 251 } |
250 | 252 |
251 } // namespace scheduler | 253 } // namespace scheduler |
252 } // namespace blink | 254 } // namespace blink |
OLD | NEW |