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

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

Issue 1314903007: Implement WebFrameScheduler and WebPageScheduler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Responding to feedback Created 5 years, 3 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 "components/scheduler/child/task_queue_manager.h" 5 #include "components/scheduler/child/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 16 matching lines...) Expand all
27 const char* disabled_by_default_verbose_tracing_category) 27 const char* disabled_by_default_verbose_tracing_category)
28 : main_task_runner_(main_task_runner), 28 : main_task_runner_(main_task_runner),
29 task_was_run_on_quiescence_monitored_queue_(false), 29 task_was_run_on_quiescence_monitored_queue_(false),
30 pending_dowork_count_(0), 30 pending_dowork_count_(0),
31 work_batch_size_(1), 31 work_batch_size_(1),
32 time_source_(new base::DefaultTickClock), 32 time_source_(new base::DefaultTickClock),
33 disabled_by_default_tracing_category_( 33 disabled_by_default_tracing_category_(
34 disabled_by_default_tracing_category), 34 disabled_by_default_tracing_category),
35 disabled_by_default_verbose_tracing_category_( 35 disabled_by_default_verbose_tracing_category_(
36 disabled_by_default_verbose_tracing_category), 36 disabled_by_default_verbose_tracing_category),
37 queue_observer_(nullptr),
37 deletion_sentinel_(new DeletionSentinel()), 38 deletion_sentinel_(new DeletionSentinel()),
38 weak_factory_(this) { 39 weak_factory_(this) {
39 DCHECK(main_task_runner->RunsTasksOnCurrentThread()); 40 DCHECK(main_task_runner->RunsTasksOnCurrentThread());
40 TRACE_EVENT_OBJECT_CREATED_WITH_ID(disabled_by_default_tracing_category, 41 TRACE_EVENT_OBJECT_CREATED_WITH_ID(disabled_by_default_tracing_category,
41 "TaskQueueManager", this); 42 "TaskQueueManager", this);
42 selector_.SetTaskQueueSelectorObserver(this); 43 selector_.SetTaskQueueSelectorObserver(this);
43 44
44 do_work_from_main_thread_closure_ = 45 do_work_from_main_thread_closure_ =
45 base::Bind(&TaskQueueManager::DoWork, weak_factory_.GetWeakPtr(), true); 46 base::Bind(&TaskQueueManager::DoWork, weak_factory_.GetWeakPtr(), true);
46 do_work_from_other_thread_closure_ = 47 do_work_from_other_thread_closure_ =
(...skipping 19 matching lines...) Expand all
66 DCHECK(main_thread_checker_.CalledOnValidThread()); 67 DCHECK(main_thread_checker_.CalledOnValidThread());
67 scoped_refptr<internal::TaskQueueImpl> queue( 68 scoped_refptr<internal::TaskQueueImpl> queue(
68 make_scoped_refptr(new internal::TaskQueueImpl( 69 make_scoped_refptr(new internal::TaskQueueImpl(
69 this, spec, disabled_by_default_tracing_category_, 70 this, spec, disabled_by_default_tracing_category_,
70 disabled_by_default_verbose_tracing_category_))); 71 disabled_by_default_verbose_tracing_category_)));
71 queues_.insert(queue); 72 queues_.insert(queue);
72 selector_.AddQueue(queue.get()); 73 selector_.AddQueue(queue.get());
73 return queue; 74 return queue;
74 } 75 }
75 76
77 void TaskQueueManager::SetQueueObserver(Observer* observer) {
78 DCHECK(main_thread_checker_.CalledOnValidThread());
79 queue_observer_ = observer;
80 }
81
76 void TaskQueueManager::UnregisterTaskQueue( 82 void TaskQueueManager::UnregisterTaskQueue(
77 scoped_refptr<internal::TaskQueueImpl> task_queue) { 83 scoped_refptr<internal::TaskQueueImpl> task_queue) {
78 TRACE_EVENT1(disabled_by_default_tracing_category_, 84 TRACE_EVENT1(disabled_by_default_tracing_category_,
79 "TaskQueueManager::UnregisterTaskQueue", 85 "TaskQueueManager::UnregisterTaskQueue",
80 "queue_name", task_queue->GetName()); 86 "queue_name", task_queue->GetName());
81 DCHECK(main_thread_checker_.CalledOnValidThread()); 87 DCHECK(main_thread_checker_.CalledOnValidThread());
88 if (queue_observer_)
89 queue_observer_->OnUnregisterTaskQueue(task_queue);
90
82 // Add |task_queue| to |queues_to_delete_| so we can prevent it from being 91 // Add |task_queue| to |queues_to_delete_| so we can prevent it from being
83 // freed while any of our structures hold hold a raw pointer to it. 92 // freed while any of our structures hold hold a raw pointer to it.
84 queues_to_delete_.insert(task_queue); 93 queues_to_delete_.insert(task_queue);
85 queues_.erase(task_queue); 94 queues_.erase(task_queue);
86 selector_.RemoveQueue(task_queue.get()); 95 selector_.RemoveQueue(task_queue.get());
87 96
88 // We need to remove |task_queue| from delayed_wakeup_map_ which is a little 97 // We need to remove |task_queue| from delayed_wakeup_map_ which is a little
89 // awkward since it's keyed by time. O(n) running time. 98 // awkward since it's keyed by time. O(n) running time.
90 for (DelayedWakeupMultimap::iterator iter = delayed_wakeup_map_.begin(); 99 for (DelayedWakeupMultimap::iterator iter = delayed_wakeup_map_.begin();
91 iter != delayed_wakeup_map_.end();) { 100 iter != delayed_wakeup_map_.end();) {
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 main_task_runner_->PostNonNestableTask(pending_task.posted_from, 343 main_task_runner_->PostNonNestableTask(pending_task.posted_from,
335 pending_task.task); 344 pending_task.task);
336 } else { 345 } else {
337 TRACE_TASK_EXECUTION("TaskQueueManager::ProcessTaskFromWorkQueue", 346 TRACE_TASK_EXECUTION("TaskQueueManager::ProcessTaskFromWorkQueue",
338 pending_task); 347 pending_task);
339 if (queue->GetShouldNotifyObservers()) { 348 if (queue->GetShouldNotifyObservers()) {
340 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, task_observers_, 349 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, task_observers_,
341 WillProcessTask(pending_task)); 350 WillProcessTask(pending_task));
342 queue->NotifyWillProcessTask(pending_task); 351 queue->NotifyWillProcessTask(pending_task);
343 } 352 }
344 TRACE_EVENT1(disabled_by_default_tracing_category_, 353 TRACE_EVENT2(disabled_by_default_tracing_category_,
345 "Run Task From Queue", "queue", queue->GetName()); 354 "TaskQueueManager::RunTask", "queue", queue->GetName(),
355 "origin", queue->GetOrigin());
346 task_annotator_.RunTask("TaskQueueManager::PostTask", pending_task); 356 task_annotator_.RunTask("TaskQueueManager::PostTask", pending_task);
347 357
348 // Detect if the TaskQueueManager just got deleted. If this happens we must 358 // Detect if the TaskQueueManager just got deleted. If this happens we must
349 // not access any member variables after this point. 359 // not access any member variables after this point.
350 if (protect->HasOneRef()) 360 if (protect->HasOneRef())
351 return true; 361 return true;
352 362
353 if (queue->GetShouldNotifyObservers()) { 363 if (queue->GetShouldNotifyObservers()) {
354 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, task_observers_, 364 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, task_observers_,
355 DidProcessTask(pending_task)); 365 DidProcessTask(pending_task));
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 } 447 }
438 448
439 void TaskQueueManager::OnTaskQueueEnabled(internal::TaskQueueImpl* queue) { 449 void TaskQueueManager::OnTaskQueueEnabled(internal::TaskQueueImpl* queue) {
440 DCHECK(main_thread_checker_.CalledOnValidThread()); 450 DCHECK(main_thread_checker_.CalledOnValidThread());
441 // Only schedule DoWork if there's something to do. 451 // Only schedule DoWork if there's something to do.
442 if (!queue->work_queue().empty()) 452 if (!queue->work_queue().empty())
443 MaybePostDoWorkOnMainRunner(); 453 MaybePostDoWorkOnMainRunner();
444 } 454 }
445 455
446 } // namespace scheduler 456 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698