Index: components/scheduler/renderer/renderer_scheduler_impl.cc |
diff --git a/components/scheduler/renderer/renderer_scheduler_impl.cc b/components/scheduler/renderer/renderer_scheduler_impl.cc |
index e58e62cbe7cc5d9b598cfa4ae59b03c91b51df50..e5b1d4680e64e1363d4ec7570b8287c33947b2ff 100644 |
--- a/components/scheduler/renderer/renderer_scheduler_impl.cc |
+++ b/components/scheduler/renderer/renderer_scheduler_impl.cc |
@@ -39,12 +39,6 @@ RendererSchedulerImpl::RendererSchedulerImpl( |
compositor_task_runner_( |
helper_.NewTaskQueue(TaskQueue::Spec("compositor_tq") |
.SetShouldMonitorQuiescence(true))), |
- loading_task_runner_( |
- helper_.NewTaskQueue(TaskQueue::Spec("loading_tq") |
- .SetShouldMonitorQuiescence(true))), |
- timer_task_runner_( |
- helper_.NewTaskQueue(TaskQueue::Spec("timer_tq") |
- .SetShouldMonitorQuiescence(true))), |
delayed_update_policy_runner_( |
base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
base::Unretained(this)), |
@@ -60,11 +54,8 @@ RendererSchedulerImpl::RendererSchedulerImpl( |
base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, |
weak_factory_.GetWeakPtr())); |
- loading_task_runner_->AddTaskObserver( |
- &MainThreadOnly().loading_task_cost_estimator); |
- |
- timer_task_runner_->AddTaskObserver( |
- &MainThreadOnly().timer_task_cost_estimator); |
+ default_loading_task_runner_ = NewLoadingTaskRunner("loading_tq"); |
+ default_timer_task_runner_ = NewTimerTaskRunner("timer_tq"); |
TRACE_EVENT_OBJECT_CREATED_WITH_ID( |
TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", |
@@ -73,16 +64,24 @@ RendererSchedulerImpl::RendererSchedulerImpl( |
// Make sure that we don't initially assume there is no idle time. |
MainThreadOnly().short_idle_period_duration.InsertSample( |
cc::BeginFrameArgs::DefaultInterval()); |
+ |
+ helper_.SetQueueObserver(this); |
} |
RendererSchedulerImpl::~RendererSchedulerImpl() { |
TRACE_EVENT_OBJECT_DELETED_WITH_ID( |
TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", |
this); |
- timer_task_runner_->RemoveTaskObserver( |
- &MainThreadOnly().timer_task_cost_estimator); |
- loading_task_runner_->RemoveTaskObserver( |
- &MainThreadOnly().loading_task_cost_estimator); |
+ |
+ for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) { |
+ loading_queue->RemoveTaskObserver( |
+ &MainThreadOnly().loading_task_cost_estimator); |
+ } |
+ for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) { |
+ timer_queue->RemoveTaskObserver( |
+ &MainThreadOnly().timer_task_cost_estimator); |
+ } |
+ |
// Ensure the renderer scheduler was shut down explicitly, because otherwise |
// we could end up having stale pointers to the Blink heap which has been |
// terminated by this point. |
@@ -149,12 +148,44 @@ RendererSchedulerImpl::IdleTaskRunner() { |
scoped_refptr<base::SingleThreadTaskRunner> |
RendererSchedulerImpl::LoadingTaskRunner() { |
helper_.CheckOnValidThread(); |
- return loading_task_runner_; |
+ return default_loading_task_runner_; |
} |
scoped_refptr<TaskQueue> RendererSchedulerImpl::TimerTaskRunner() { |
helper_.CheckOnValidThread(); |
- return timer_task_runner_; |
+ return default_timer_task_runner_; |
+} |
+ |
+scoped_refptr<TaskQueue> RendererSchedulerImpl::NewLoadingTaskRunner( |
+ const char* name) { |
+ helper_.CheckOnValidThread(); |
+ scoped_refptr<TaskQueue> loading_task_queue(helper_.NewTaskQueue( |
+ TaskQueue::Spec(name).SetShouldMonitorQuiescence(true))); |
+ loading_task_runners_.insert(loading_task_queue); |
+ loading_task_queue->SetQueuePriority( |
+ MainThreadOnly().current_policy.loading_queue_priority); |
+ loading_task_queue->AddTaskObserver( |
+ &MainThreadOnly().loading_task_cost_estimator); |
+ return loading_task_queue; |
+} |
+ |
+scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskRunner( |
+ const char* name) { |
+ helper_.CheckOnValidThread(); |
+ scoped_refptr<TaskQueue> timer_task_queue(helper_.NewTaskQueue( |
+ TaskQueue::Spec(name).SetShouldMonitorQuiescence(true))); |
+ timer_task_runners_.insert(timer_task_queue); |
+ timer_task_queue->SetQueuePriority( |
+ MainThreadOnly().current_policy.timer_queue_priority); |
+ timer_task_queue->AddTaskObserver( |
+ &MainThreadOnly().timer_task_cost_estimator); |
+ return timer_task_queue; |
+} |
+ |
+void RendererSchedulerImpl::OnUnregisterTaskQueue( |
+ const scoped_refptr<TaskQueue>& task_queue) { |
+ loading_task_runners_.erase(task_queue); |
+ timer_task_runners_.erase(task_queue); |
} |
bool RendererSchedulerImpl::CanExceedIdleDeadlineIfRequired() const { |
@@ -623,8 +654,12 @@ void RendererSchedulerImpl::UpdatePolicyLocked(UpdateType update_type) { |
compositor_task_runner_->SetQueuePriority( |
new_policy.compositor_queue_priority); |
- loading_task_runner_->SetQueuePriority(new_policy.loading_queue_priority); |
- timer_task_runner_->SetQueuePriority(new_policy.timer_queue_priority); |
+ for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) { |
+ loading_queue->SetQueuePriority(new_policy.loading_queue_priority); |
+ } |
+ for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) { |
+ timer_queue->SetQueuePriority(new_policy.timer_queue_priority); |
+ } |
// TODO(alexclarke): We shouldn't have to prioritize the default queue, but it |
// appears to be necessary since the order of loading tasks and IPCs (which |
@@ -705,7 +740,7 @@ SchedulerHelper* RendererSchedulerImpl::GetSchedulerHelperForTesting() { |
void RendererSchedulerImpl::SuspendTimerQueue() { |
MainThreadOnly().timer_queue_suspend_count++; |
ForceUpdatePolicy(); |
- DCHECK(!timer_task_runner_->IsQueueEnabled()); |
+ DCHECK(!default_timer_task_runner_->IsQueueEnabled()); |
} |
void RendererSchedulerImpl::ResumeTimerQueue() { |