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

Side by Side Diff: content/renderer/scheduler/task_queue_manager.cc

Issue 845543004: Run task queue manager work in batches (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased. Created 5 years, 11 months 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 "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
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
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
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
OLDNEW
« no previous file with comments | « content/renderer/scheduler/task_queue_manager.h ('k') | content/renderer/scheduler/task_queue_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698