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 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::SetObserver(Observer* observer) { | |
78 DCHECK(main_thread_checker_.CalledOnValidThread()); | |
79 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 (observer_) | |
89 observer_->OnUnregisterTaskQueue(task_queue); | |
rmcilroy
2015/09/18 13:15:46
Rather than adding this observer interface chain,
Sami
2015/09/21 10:52:36
That was the other alternative we thought about. T
rmcilroy
2015/09/23 09:44:25
Ahh, I didn't realize Unregister() was a TaskQueue
| |
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 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
345 } | 354 } |
346 | 355 |
347 TRACE_TASK_EXECUTION("TaskQueueManager::ProcessTaskFromWorkQueue", | 356 TRACE_TASK_EXECUTION("TaskQueueManager::ProcessTaskFromWorkQueue", |
348 pending_task); | 357 pending_task); |
349 if (queue->GetShouldNotifyObservers()) { | 358 if (queue->GetShouldNotifyObservers()) { |
350 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, task_observers_, | 359 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, task_observers_, |
351 WillProcessTask(pending_task)); | 360 WillProcessTask(pending_task)); |
352 queue->NotifyWillProcessTask(pending_task); | 361 queue->NotifyWillProcessTask(pending_task); |
353 } | 362 } |
354 TRACE_EVENT1(disabled_by_default_tracing_category_, | 363 TRACE_EVENT1(disabled_by_default_tracing_category_, |
355 "Run Task From Queue", "queue", queue->GetName()); | 364 "TaskQueueManager::RunTask", "queue", queue->GetName()); |
356 task_annotator_.RunTask("TaskQueueManager::PostTask", pending_task); | 365 task_annotator_.RunTask("TaskQueueManager::PostTask", pending_task); |
357 | 366 |
358 // Detect if the TaskQueueManager just got deleted. If this happens we must | 367 // Detect if the TaskQueueManager just got deleted. If this happens we must |
359 // not access any member variables after this point. | 368 // not access any member variables after this point. |
360 if (protect->HasOneRef()) | 369 if (protect->HasOneRef()) |
361 return ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED; | 370 return ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED; |
362 | 371 |
363 if (queue->GetShouldNotifyObservers()) { | 372 if (queue->GetShouldNotifyObservers()) { |
364 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, task_observers_, | 373 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, task_observers_, |
365 DidProcessTask(pending_task)); | 374 DidProcessTask(pending_task)); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
446 } | 455 } |
447 | 456 |
448 void TaskQueueManager::OnTaskQueueEnabled(internal::TaskQueueImpl* queue) { | 457 void TaskQueueManager::OnTaskQueueEnabled(internal::TaskQueueImpl* queue) { |
449 DCHECK(main_thread_checker_.CalledOnValidThread()); | 458 DCHECK(main_thread_checker_.CalledOnValidThread()); |
450 // Only schedule DoWork if there's something to do. | 459 // Only schedule DoWork if there's something to do. |
451 if (!queue->work_queue().empty()) | 460 if (!queue->work_queue().empty()) |
452 MaybePostDoWorkOnMainRunner(); | 461 MaybePostDoWorkOnMainRunner(); |
453 } | 462 } |
454 | 463 |
455 } // namespace scheduler | 464 } // namespace scheduler |
OLD | NEW |