Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1053)

Side by Side Diff: components/scheduler/base/task_queue_manager.cc

Issue 1411843008: Make blink platform time consistent with the timer virtual time (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698