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 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 newly_updatable_.pop_back(); | 164 newly_updatable_.pop_back(); |
165 } | 165 } |
166 } | 166 } |
167 | 167 |
168 void TaskQueueManager::UpdateWorkQueues( | 168 void TaskQueueManager::UpdateWorkQueues( |
169 bool should_trigger_wakeup, | 169 bool should_trigger_wakeup, |
170 const internal::TaskQueueImpl::Task* previous_task) { | 170 const internal::TaskQueueImpl::Task* previous_task) { |
171 DCHECK(main_thread_checker_.CalledOnValidThread()); | 171 DCHECK(main_thread_checker_.CalledOnValidThread()); |
172 TRACE_EVENT0(disabled_by_default_tracing_category_, | 172 TRACE_EVENT0(disabled_by_default_tracing_category_, |
173 "TaskQueueManager::UpdateWorkQueues"); | 173 "TaskQueueManager::UpdateWorkQueues"); |
174 internal::LazyNow lazy_now(tick_clock()); | 174 internal::LazyNow lazy_now(delegate().get()); |
175 | 175 |
176 // Move any ready delayed tasks into the incomming queues. | 176 // Move any ready delayed tasks into the incomming queues. |
177 WakeupReadyDelayedQueues(&lazy_now); | 177 WakeupReadyDelayedQueues(&lazy_now); |
178 | 178 |
179 MoveNewlyUpdatableQueuesIntoUpdatableQueueSet(); | 179 MoveNewlyUpdatableQueuesIntoUpdatableQueueSet(); |
180 | 180 |
181 auto iter = updatable_queue_set_.begin(); | 181 auto iter = updatable_queue_set_.begin(); |
182 while (iter != updatable_queue_set_.end()) { | 182 while (iter != updatable_queue_set_.end()) { |
183 internal::TaskQueueImpl* queue = *iter++; | 183 internal::TaskQueueImpl* queue = *iter++; |
184 // NOTE Update work queue may erase itself from |updatable_queue_set_|. | 184 // NOTE Update work queue may erase itself from |updatable_queue_set_|. |
185 // This is fine, erasing an element won't invalidate any interator, as long | 185 // This is fine, erasing an element won't invalidate any interator, as long |
186 // as the iterator isn't the element being delated. | 186 // as the iterator isn't the element being delated. |
187 if (queue->work_queue().empty()) | 187 if (queue->work_queue().empty()) |
188 queue->UpdateWorkQueue(&lazy_now, should_trigger_wakeup, previous_task); | 188 queue->UpdateWorkQueue(&lazy_now, should_trigger_wakeup, previous_task); |
189 } | 189 } |
190 } | 190 } |
191 | 191 |
192 void TaskQueueManager::ScheduleDelayedWorkTask( | 192 void TaskQueueManager::ScheduleDelayedWorkTask( |
193 scoped_refptr<internal::TaskQueueImpl> queue, | 193 scoped_refptr<internal::TaskQueueImpl> queue, |
194 base::TimeTicks delayed_run_time) { | 194 base::TimeTicks delayed_run_time) { |
195 internal::LazyNow lazy_now(tick_clock()); | 195 internal::LazyNow lazy_now(delegate().get()); |
196 ScheduleDelayedWork(queue.get(), delayed_run_time, &lazy_now); | 196 ScheduleDelayedWork(queue.get(), delayed_run_time, &lazy_now); |
197 } | 197 } |
198 | 198 |
199 void TaskQueueManager::ScheduleDelayedWork(internal::TaskQueueImpl* queue, | 199 void TaskQueueManager::ScheduleDelayedWork(internal::TaskQueueImpl* queue, |
200 base::TimeTicks delayed_run_time, | 200 base::TimeTicks delayed_run_time, |
201 internal::LazyNow* lazy_now) { | 201 internal::LazyNow* lazy_now) { |
202 if (!delegate_->BelongsToCurrentThread()) { | 202 if (!delegate_->BelongsToCurrentThread()) { |
203 // NOTE posting a delayed task from a different thread is not expected to be | 203 // NOTE posting a delayed task from a different thread is not expected to be |
204 // common. This pathway is less optimal than perhaps it could be because | 204 // common. This pathway is less optimal than perhaps it could be because |
205 // it causes two main thread tasks to be run. Should this assumption prove | 205 // it causes two main thread tasks to be run. Should this assumption prove |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 DCHECK(main_thread_checker_.CalledOnValidThread()); | 393 DCHECK(main_thread_checker_.CalledOnValidThread()); |
394 task_observers_.RemoveObserver(task_observer); | 394 task_observers_.RemoveObserver(task_observer); |
395 } | 395 } |
396 | 396 |
397 bool TaskQueueManager::GetAndClearSystemIsQuiescentBit() { | 397 bool TaskQueueManager::GetAndClearSystemIsQuiescentBit() { |
398 bool task_was_run = task_was_run_on_quiescence_monitored_queue_; | 398 bool task_was_run = task_was_run_on_quiescence_monitored_queue_; |
399 task_was_run_on_quiescence_monitored_queue_ = false; | 399 task_was_run_on_quiescence_monitored_queue_ = false; |
400 return !task_was_run; | 400 return !task_was_run; |
401 } | 401 } |
402 | 402 |
403 base::TickClock* TaskQueueManager::tick_clock() const { | 403 const scoped_refptr<TaskQueueManagerDelegate>& TaskQueueManager::delegate() |
404 return delegate_.get(); | 404 const { |
| 405 return delegate_; |
405 } | 406 } |
406 | 407 |
407 int TaskQueueManager::GetNextSequenceNumber() { | 408 int TaskQueueManager::GetNextSequenceNumber() { |
408 return task_sequence_num_.GetNext(); | 409 return task_sequence_num_.GetNext(); |
409 } | 410 } |
410 | 411 |
411 scoped_refptr<base::trace_event::ConvertableToTraceFormat> | 412 scoped_refptr<base::trace_event::ConvertableToTraceFormat> |
412 TaskQueueManager::AsValueWithSelectorResult( | 413 TaskQueueManager::AsValueWithSelectorResult( |
413 bool should_run, | 414 bool should_run, |
414 internal::TaskQueueImpl* selected_queue) const { | 415 internal::TaskQueueImpl* selected_queue) const { |
(...skipping 18 matching lines...) Expand all Loading... |
433 } | 434 } |
434 | 435 |
435 void TaskQueueManager::OnTaskQueueEnabled(internal::TaskQueueImpl* queue) { | 436 void TaskQueueManager::OnTaskQueueEnabled(internal::TaskQueueImpl* queue) { |
436 DCHECK(main_thread_checker_.CalledOnValidThread()); | 437 DCHECK(main_thread_checker_.CalledOnValidThread()); |
437 // Only schedule DoWork if there's something to do. | 438 // Only schedule DoWork if there's something to do. |
438 if (!queue->work_queue().empty()) | 439 if (!queue->work_queue().empty()) |
439 MaybePostDoWorkOnMainRunner(); | 440 MaybePostDoWorkOnMainRunner(); |
440 } | 441 } |
441 | 442 |
442 } // namespace scheduler | 443 } // namespace scheduler |
OLD | NEW |