OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "components/scheduler/base/task_queue_manager.h" | 5 #include "components/scheduler/base/task_queue_manager.h" |
6 | 6 |
7 #include <queue> | 7 #include <queue> |
8 #include <set> | 8 #include <set> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
166 newly_updatable_.pop_back(); | 166 newly_updatable_.pop_back(); |
167 } | 167 } |
168 } | 168 } |
169 | 169 |
170 void TaskQueueManager::UpdateWorkQueues( | 170 void TaskQueueManager::UpdateWorkQueues( |
171 bool should_trigger_wakeup, | 171 bool should_trigger_wakeup, |
172 const internal::TaskQueueImpl::Task* previous_task) { | 172 const internal::TaskQueueImpl::Task* previous_task) { |
173 DCHECK(main_thread_checker_.CalledOnValidThread()); | 173 DCHECK(main_thread_checker_.CalledOnValidThread()); |
174 TRACE_EVENT0(disabled_by_default_tracing_category_, | 174 TRACE_EVENT0(disabled_by_default_tracing_category_, |
175 "TaskQueueManager::UpdateWorkQueues"); | 175 "TaskQueueManager::UpdateWorkQueues"); |
176 internal::LazyNow lazy_now(tick_clock()); | 176 internal::LazyNow lazy_now(delegate()); |
177 | 177 |
178 // Move any ready delayed tasks into the incomming queues. | 178 // Move any ready delayed tasks into the incomming queues. |
179 WakeupReadyDelayedQueues(&lazy_now); | 179 WakeupReadyDelayedQueues(&lazy_now); |
180 | 180 |
181 MoveNewlyUpdatableQueuesIntoUpdatableQueueSet(); | 181 MoveNewlyUpdatableQueuesIntoUpdatableQueueSet(); |
182 | 182 |
183 auto iter = updatable_queue_set_.begin(); | 183 auto iter = updatable_queue_set_.begin(); |
184 while (iter != updatable_queue_set_.end()) { | 184 while (iter != updatable_queue_set_.end()) { |
185 internal::TaskQueueImpl* queue = *iter++; | 185 internal::TaskQueueImpl* queue = *iter++; |
186 // NOTE Update work queue may erase itself from |updatable_queue_set_|. | 186 // NOTE Update work queue may erase itself from |updatable_queue_set_|. |
187 // This is fine, erasing an element won't invalidate any interator, as long | 187 // This is fine, erasing an element won't invalidate any interator, as long |
188 // as the iterator isn't the element being delated. | 188 // as the iterator isn't the element being delated. |
189 if (queue->work_queue().empty()) | 189 if (queue->work_queue().empty()) |
190 queue->UpdateWorkQueue(&lazy_now, should_trigger_wakeup, previous_task); | 190 queue->UpdateWorkQueue(&lazy_now, should_trigger_wakeup, previous_task); |
191 } | 191 } |
192 } | 192 } |
193 | 193 |
194 void TaskQueueManager::ScheduleDelayedWorkTask( | 194 void TaskQueueManager::ScheduleDelayedWorkTask( |
195 scoped_refptr<internal::TaskQueueImpl> queue, | 195 scoped_refptr<internal::TaskQueueImpl> queue, |
196 base::TimeTicks delayed_run_time) { | 196 base::TimeTicks delayed_run_time) { |
197 internal::LazyNow lazy_now(tick_clock()); | 197 internal::LazyNow lazy_now(delegate()); |
198 ScheduleDelayedWork(queue.get(), delayed_run_time, &lazy_now); | 198 ScheduleDelayedWork(queue.get(), delayed_run_time, &lazy_now); |
199 } | 199 } |
200 | 200 |
201 void TaskQueueManager::ScheduleDelayedWork(internal::TaskQueueImpl* queue, | 201 void TaskQueueManager::ScheduleDelayedWork(internal::TaskQueueImpl* queue, |
202 base::TimeTicks delayed_run_time, | 202 base::TimeTicks delayed_run_time, |
203 internal::LazyNow* lazy_now) { | 203 internal::LazyNow* lazy_now) { |
204 if (!delegate_->BelongsToCurrentThread()) { | 204 if (!delegate_->BelongsToCurrentThread()) { |
205 // NOTE posting a delayed task from a different thread is not expected to be | 205 // NOTE posting a delayed task from a different thread is not expected to be |
206 // common. This pathway is less optimal than perhaps it could be because | 206 // common. This pathway is less optimal than perhaps it could be because |
207 // it causes two main thread tasks to be run. Should this assumption prove | 207 // it causes two main thread tasks to be run. Should this assumption prove |
(...skipping 14 matching lines...) Expand all Loading... |
222 std::max(base::TimeDelta(), delayed_run_time - lazy_now->Now()); | 222 std::max(base::TimeDelta(), delayed_run_time - lazy_now->Now()); |
223 delegate_->PostDelayedTask(FROM_HERE, delayed_queue_wakeup_closure_, delay); | 223 delegate_->PostDelayedTask(FROM_HERE, delayed_queue_wakeup_closure_, delay); |
224 } | 224 } |
225 delayed_wakeup_multimap_.insert(std::make_pair(delayed_run_time, queue)); | 225 delayed_wakeup_multimap_.insert(std::make_pair(delayed_run_time, queue)); |
226 } | 226 } |
227 | 227 |
228 void TaskQueueManager::DelayedDoWork() { | 228 void TaskQueueManager::DelayedDoWork() { |
229 DCHECK(main_thread_checker_.CalledOnValidThread()); | 229 DCHECK(main_thread_checker_.CalledOnValidThread()); |
230 | 230 |
231 { | 231 { |
232 internal::LazyNow lazy_now(tick_clock()); | 232 internal::LazyNow lazy_now(delegate()); |
233 WakeupReadyDelayedQueues(&lazy_now); | 233 WakeupReadyDelayedQueues(&lazy_now); |
234 } | 234 } |
235 | 235 |
236 DoWork(false); | 236 DoWork(false); |
237 } | 237 } |
238 | 238 |
239 void TaskQueueManager::WakeupReadyDelayedQueues(internal::LazyNow* lazy_now) { | 239 void TaskQueueManager::WakeupReadyDelayedQueues(internal::LazyNow* lazy_now) { |
240 // Wake up any queues with pending delayed work. Note std::multipmap stores | 240 // Wake up any queues with pending delayed work. Note std::multipmap stores |
241 // the elements sorted by key, so the begin() iterator points to the earliest | 241 // the elements sorted by key, so the begin() iterator points to the earliest |
242 // queue to wakeup. | 242 // queue to wakeup. |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
406 DCHECK(main_thread_checker_.CalledOnValidThread()); | 406 DCHECK(main_thread_checker_.CalledOnValidThread()); |
407 task_observers_.RemoveObserver(task_observer); | 407 task_observers_.RemoveObserver(task_observer); |
408 } | 408 } |
409 | 409 |
410 bool TaskQueueManager::GetAndClearSystemIsQuiescentBit() { | 410 bool TaskQueueManager::GetAndClearSystemIsQuiescentBit() { |
411 bool task_was_run = task_was_run_on_quiescence_monitored_queue_; | 411 bool task_was_run = task_was_run_on_quiescence_monitored_queue_; |
412 task_was_run_on_quiescence_monitored_queue_ = false; | 412 task_was_run_on_quiescence_monitored_queue_ = false; |
413 return !task_was_run; | 413 return !task_was_run; |
414 } | 414 } |
415 | 415 |
416 base::TickClock* TaskQueueManager::tick_clock() const { | 416 TaskQueueManagerDelegate* TaskQueueManager::delegate() const { |
417 return delegate_.get(); | 417 return delegate_.get(); |
418 } | 418 } |
419 | 419 |
420 int TaskQueueManager::GetNextSequenceNumber() { | 420 int TaskQueueManager::GetNextSequenceNumber() { |
421 return task_sequence_num_.GetNext(); | 421 return task_sequence_num_.GetNext(); |
422 } | 422 } |
423 | 423 |
424 scoped_refptr<base::trace_event::ConvertableToTraceFormat> | 424 scoped_refptr<base::trace_event::ConvertableToTraceFormat> |
425 TaskQueueManager::AsValueWithSelectorResult( | 425 TaskQueueManager::AsValueWithSelectorResult( |
426 bool should_run, | 426 bool should_run, |
(...skipping 19 matching lines...) Expand all Loading... |
446 } | 446 } |
447 | 447 |
448 void TaskQueueManager::OnTaskQueueEnabled(internal::TaskQueueImpl* queue) { | 448 void TaskQueueManager::OnTaskQueueEnabled(internal::TaskQueueImpl* queue) { |
449 DCHECK(main_thread_checker_.CalledOnValidThread()); | 449 DCHECK(main_thread_checker_.CalledOnValidThread()); |
450 // Only schedule DoWork if there's something to do. | 450 // Only schedule DoWork if there's something to do. |
451 if (!queue->work_queue().empty()) | 451 if (!queue->work_queue().empty()) |
452 MaybePostDoWorkOnMainRunner(); | 452 MaybePostDoWorkOnMainRunner(); |
453 } | 453 } |
454 | 454 |
455 } // namespace scheduler | 455 } // namespace scheduler |
OLD | NEW |