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 |