| 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 |