| 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); |
| 82 // Add |task_queue| to |queues_to_delete_| so we can prevent it from being | 90 // 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. | 91 // freed while any of our structures hold hold a raw pointer to it. |
| 84 queues_to_delete_.insert(task_queue); | 92 queues_to_delete_.insert(task_queue); |
| 85 queues_.erase(task_queue); | 93 queues_.erase(task_queue); |
| 86 selector_.RemoveQueue(task_queue.get()); | 94 selector_.RemoveQueue(task_queue.get()); |
| 87 | 95 |
| 88 // We need to remove |task_queue| from delayed_wakeup_map_ which is a little | 96 // 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. | 97 // awkward since it's keyed by time. O(n) running time. |
| 90 for (DelayedWakeupMultimap::iterator iter = delayed_wakeup_map_.begin(); | 98 for (DelayedWakeupMultimap::iterator iter = delayed_wakeup_map_.begin(); |
| 91 iter != delayed_wakeup_map_.end();) { | 99 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, | 342 main_task_runner_->PostNonNestableTask(pending_task.posted_from, |
| 335 pending_task.task); | 343 pending_task.task); |
| 336 } else { | 344 } else { |
| 337 TRACE_TASK_EXECUTION("TaskQueueManager::ProcessTaskFromWorkQueue", | 345 TRACE_TASK_EXECUTION("TaskQueueManager::ProcessTaskFromWorkQueue", |
| 338 pending_task); | 346 pending_task); |
| 339 if (queue->GetShouldNotifyObservers()) { | 347 if (queue->GetShouldNotifyObservers()) { |
| 340 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, task_observers_, | 348 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, task_observers_, |
| 341 WillProcessTask(pending_task)); | 349 WillProcessTask(pending_task)); |
| 342 queue->NotifyWillProcessTask(pending_task); | 350 queue->NotifyWillProcessTask(pending_task); |
| 343 } | 351 } |
| 344 TRACE_EVENT1(disabled_by_default_tracing_category_, | 352 TRACE_EVENT2(disabled_by_default_tracing_category_, |
| 345 "Run Task From Queue", "queue", queue->GetName()); | 353 "TaskQueueManager::ProcessTaskFromWorkQueue", "queue", |
| 354 queue->GetName(), "origin", queue->GetOrigin()); |
| 346 task_annotator_.RunTask("TaskQueueManager::PostTask", pending_task); | 355 task_annotator_.RunTask("TaskQueueManager::PostTask", pending_task); |
| 347 | 356 |
| 348 // Detect if the TaskQueueManager just got deleted. If this happens we must | 357 // Detect if the TaskQueueManager just got deleted. If this happens we must |
| 349 // not access any member variables after this point. | 358 // not access any member variables after this point. |
| 350 if (protect->HasOneRef()) | 359 if (protect->HasOneRef()) |
| 351 return true; | 360 return true; |
| 352 | 361 |
| 353 if (queue->GetShouldNotifyObservers()) { | 362 if (queue->GetShouldNotifyObservers()) { |
| 354 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, task_observers_, | 363 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, task_observers_, |
| 355 DidProcessTask(pending_task)); | 364 DidProcessTask(pending_task)); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 } | 446 } |
| 438 | 447 |
| 439 void TaskQueueManager::OnTaskQueueEnabled(internal::TaskQueueImpl* queue) { | 448 void TaskQueueManager::OnTaskQueueEnabled(internal::TaskQueueImpl* queue) { |
| 440 DCHECK(main_thread_checker_.CalledOnValidThread()); | 449 DCHECK(main_thread_checker_.CalledOnValidThread()); |
| 441 // Only schedule DoWork if there's something to do. | 450 // Only schedule DoWork if there's something to do. |
| 442 if (!queue->work_queue().empty()) | 451 if (!queue->work_queue().empty()) |
| 443 MaybePostDoWorkOnMainRunner(); | 452 MaybePostDoWorkOnMainRunner(); |
| 444 } | 453 } |
| 445 | 454 |
| 446 } // namespace scheduler | 455 } // namespace scheduler |
| OLD | NEW |