Chromium Code Reviews| 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 "content/renderer/scheduler/task_queue_manager.h" | 5 #include "content/renderer/scheduler/task_queue_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
| 9 #include "base/debug/trace_event_argument.h" | 9 #include "base/debug/trace_event_argument.h" |
| 10 #include "content/renderer/scheduler/task_queue_selector.h" | 10 #include "content/renderer/scheduler/task_queue_selector.h" |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 238 | 238 |
| 239 } // namespace internal | 239 } // namespace internal |
| 240 | 240 |
| 241 TaskQueueManager::TaskQueueManager( | 241 TaskQueueManager::TaskQueueManager( |
| 242 size_t task_queue_count, | 242 size_t task_queue_count, |
| 243 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, | 243 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
| 244 TaskQueueSelector* selector) | 244 TaskQueueSelector* selector) |
| 245 : main_task_runner_(main_task_runner), | 245 : main_task_runner_(main_task_runner), |
| 246 selector_(selector), | 246 selector_(selector), |
| 247 pending_dowork_count_(0), | 247 pending_dowork_count_(0), |
| 248 work_batch_size_(1), | |
| 248 weak_factory_(this) { | 249 weak_factory_(this) { |
| 249 DCHECK(main_task_runner->RunsTasksOnCurrentThread()); | 250 DCHECK(main_task_runner->RunsTasksOnCurrentThread()); |
| 250 TRACE_EVENT_OBJECT_CREATED_WITH_ID( | 251 TRACE_EVENT_OBJECT_CREATED_WITH_ID( |
| 251 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "TaskQueueManager", | 252 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "TaskQueueManager", |
| 252 this); | 253 this); |
| 253 | 254 |
| 254 task_queue_manager_weak_ptr_ = weak_factory_.GetWeakPtr(); | 255 task_queue_manager_weak_ptr_ = weak_factory_.GetWeakPtr(); |
| 255 for (size_t i = 0; i < task_queue_count; i++) { | 256 for (size_t i = 0; i < task_queue_count; i++) { |
| 256 scoped_refptr<internal::TaskQueue> queue( | 257 scoped_refptr<internal::TaskQueue> queue( |
| 257 make_scoped_refptr(new internal::TaskQueue(this))); | 258 make_scoped_refptr(new internal::TaskQueue(this))); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 325 FROM_HERE, Bind(&TaskQueueManager::DoWork, task_queue_manager_weak_ptr_, | 326 FROM_HERE, Bind(&TaskQueueManager::DoWork, task_queue_manager_weak_ptr_, |
| 326 on_main_thread)); | 327 on_main_thread)); |
| 327 } | 328 } |
| 328 | 329 |
| 329 void TaskQueueManager::DoWork(bool posted_from_main_thread) { | 330 void TaskQueueManager::DoWork(bool posted_from_main_thread) { |
| 330 if (posted_from_main_thread) { | 331 if (posted_from_main_thread) { |
| 331 pending_dowork_count_--; | 332 pending_dowork_count_--; |
| 332 DCHECK_GE(pending_dowork_count_, 0); | 333 DCHECK_GE(pending_dowork_count_, 0); |
| 333 } | 334 } |
| 334 main_thread_checker_.CalledOnValidThread(); | 335 main_thread_checker_.CalledOnValidThread(); |
| 335 if (!UpdateWorkQueues()) | |
| 336 return; | |
| 337 | 336 |
| 338 size_t queue_index; | 337 for (int i = 0; i < work_batch_size_; i++) { |
| 339 if (!SelectWorkQueueToService(&queue_index)) | 338 if (!UpdateWorkQueues()) |
| 340 return; | 339 return; |
| 341 MaybePostDoWorkOnMainRunner(); | 340 |
| 342 ProcessTaskFromWorkQueue(queue_index); | 341 size_t queue_index; |
| 342 if (!SelectWorkQueueToService(&queue_index)) | |
| 343 return; | |
| 344 if (i == 0) | |
| 345 MaybePostDoWorkOnMainRunner(); | |
| 346 ProcessTaskFromWorkQueue(queue_index); | |
| 347 } | |
|
rmcilroy
2015/01/14 17:56:37
Would the following work:
if (!UpdateWorkQueues()
Sami
2015/01/14 18:11:49
I had the same idea and chose to do polling inside
rmcilroy
2015/01/14 19:34:48
Good point
| |
| 343 } | 348 } |
| 344 | 349 |
| 345 bool TaskQueueManager::SelectWorkQueueToService(size_t* out_queue_index) { | 350 bool TaskQueueManager::SelectWorkQueueToService(size_t* out_queue_index) { |
| 346 bool should_run = selector_->SelectWorkQueueToService(out_queue_index); | 351 bool should_run = selector_->SelectWorkQueueToService(out_queue_index); |
| 347 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( | 352 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( |
| 348 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "TaskQueueManager", this, | 353 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "TaskQueueManager", this, |
| 349 AsValueWithSelectorResult(should_run, *out_queue_index)); | 354 AsValueWithSelectorResult(should_run, *out_queue_index)); |
| 350 return should_run; | 355 return should_run; |
| 351 } | 356 } |
| 352 | 357 |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 381 DCHECK(delay > base::TimeDelta()); | 386 DCHECK(delay > base::TimeDelta()); |
| 382 return main_task_runner_->PostDelayedTask(from_here, task, delay); | 387 return main_task_runner_->PostDelayedTask(from_here, task, delay); |
| 383 } | 388 } |
| 384 | 389 |
| 385 void TaskQueueManager::SetQueueName(size_t queue_index, const char* name) { | 390 void TaskQueueManager::SetQueueName(size_t queue_index, const char* name) { |
| 386 main_thread_checker_.CalledOnValidThread(); | 391 main_thread_checker_.CalledOnValidThread(); |
| 387 internal::TaskQueue* queue = Queue(queue_index); | 392 internal::TaskQueue* queue = Queue(queue_index); |
| 388 queue->set_name(name); | 393 queue->set_name(name); |
| 389 } | 394 } |
| 390 | 395 |
| 396 void TaskQueueManager::SetWorkBatchSize(int work_batch_size) { | |
| 397 main_thread_checker_.CalledOnValidThread(); | |
| 398 DCHECK_GE(work_batch_size, 1); | |
| 399 work_batch_size_ = work_batch_size; | |
| 400 } | |
| 401 | |
| 391 scoped_refptr<base::debug::ConvertableToTraceFormat> | 402 scoped_refptr<base::debug::ConvertableToTraceFormat> |
| 392 TaskQueueManager::AsValueWithSelectorResult(bool should_run, | 403 TaskQueueManager::AsValueWithSelectorResult(bool should_run, |
| 393 size_t selected_queue) const { | 404 size_t selected_queue) const { |
| 394 main_thread_checker_.CalledOnValidThread(); | 405 main_thread_checker_.CalledOnValidThread(); |
| 395 scoped_refptr<base::debug::TracedValue> state = | 406 scoped_refptr<base::debug::TracedValue> state = |
| 396 new base::debug::TracedValue(); | 407 new base::debug::TracedValue(); |
| 397 state->BeginArray("queues"); | 408 state->BeginArray("queues"); |
| 398 for (auto& queue : queues_) | 409 for (auto& queue : queues_) |
| 399 queue->AsValueInto(state.get()); | 410 queue->AsValueInto(state.get()); |
| 400 state->EndArray(); | 411 state->EndArray(); |
| 401 state->BeginDictionary("selector"); | 412 state->BeginDictionary("selector"); |
| 402 selector_->AsValueInto(state.get()); | 413 selector_->AsValueInto(state.get()); |
| 403 state->EndDictionary(); | 414 state->EndDictionary(); |
| 404 if (should_run) | 415 if (should_run) |
| 405 state->SetInteger("selected_queue", selected_queue); | 416 state->SetInteger("selected_queue", selected_queue); |
| 406 return state; | 417 return state; |
| 407 } | 418 } |
| 408 | 419 |
| 409 } // namespace content | 420 } // namespace content |
| OLD | NEW |