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 bb5dc7224f7cbf2650d316d3e55060fae20b09b2..74dcb4e7e0cd9b2303a093810ebd3f97e1ed02f8 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"); |
rmcilroy
2015/09/18 13:15:46
nit - "default_loading_tq" and same for timer_tq b
Sami
2015/09/21 10:52:36
Good idea, done.
|
+ 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_.SetObserver(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,51 @@ 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) { |
+ if (loading_task_runners_.find(task_queue) != loading_task_runners_.end()) { |
+ task_queue->RemoveTaskObserver( |
+ &MainThreadOnly().loading_task_cost_estimator); |
+ loading_task_runners_.erase(task_queue); |
+ } else if (timer_task_runners_.find(task_queue) != |
+ timer_task_runners_.end()) { |
+ task_queue->RemoveTaskObserver(&MainThreadOnly().timer_task_cost_estimator); |
+ timer_task_runners_.erase(task_queue); |
+ } |
rmcilroy
2015/09/18 13:15:46
Should we DCHECK that we find it in one or the oth
Sami
2015/09/21 10:52:36
I had exactly the same thought first, but the prob
rmcilroy
2015/09/23 09:44:25
Acknowledged.
|
} |
bool RendererSchedulerImpl::CanExceedIdleDeadlineIfRequired() const { |
@@ -623,8 +661,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 |
@@ -715,7 +757,10 @@ RendererSchedulerImpl::GetTimerTaskCostEstimatorForTesting() { |
void RendererSchedulerImpl::SuspendTimerQueue() { |
MainThreadOnly().timer_queue_suspend_count++; |
ForceUpdatePolicy(); |
- DCHECK(!timer_task_runner_->IsQueueEnabled()); |
+ DCHECK(!default_timer_task_runner_->IsQueueEnabled()); |
+ for (const auto& runner : timer_task_runners_) { |
rmcilroy
2015/09/18 13:15:46
Can you make this for loop only run in DEBUG since
Sami
2015/09/21 10:52:36
Sure. I was hoping the compiler would do that for
|
+ DCHECK(!runner->IsQueueEnabled()); |
+ } |
} |
void RendererSchedulerImpl::ResumeTimerQueue() { |