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 "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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |