Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1125)

Unified Diff: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc

Issue 2540663002: Add the concept of QueueEnabledVoters to blink scheduler TaskQueue (Closed)
Patch Set: Fix test crashes and address feedback. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
index cb11ca69f11c663c5e072675bcc88996d12937e0..0567304e4a5c03c4476ce3fb26574e73eaf87c3a 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
@@ -95,6 +95,8 @@ RendererSchedulerImpl::RendererSchedulerImpl(
compositor_task_runner_(
helper_.NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::COMPOSITOR)
.SetShouldMonitorQuiescence(true))),
+ compositor_task_runner_enabled_voter_(
+ compositor_task_runner_->CreateQueueEnabledVoter()),
delayed_update_policy_runner_(
base::Bind(&RendererSchedulerImpl::UpdatePolicy,
base::Unretained(this)),
@@ -141,13 +143,12 @@ RendererSchedulerImpl::~RendererSchedulerImpl() {
TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
this);
- for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) {
- loading_queue->RemoveTaskObserver(
+ for (auto& pair : loading_task_runners_) {
+ pair.first->RemoveTaskObserver(
&MainThreadOnly().loading_task_cost_estimator);
}
- for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) {
- timer_queue->RemoveTaskObserver(
- &MainThreadOnly().timer_task_cost_estimator);
+ for (auto& pair : timer_task_runners_) {
+ pair.first->RemoveTaskObserver(&MainThreadOnly().timer_task_cost_estimator);
}
if (virtual_time_domain_)
@@ -285,8 +286,9 @@ scoped_refptr<TaskQueue> RendererSchedulerImpl::NewLoadingTaskRunner(
.SetTimeDomain(MainThreadOnly().use_virtual_time
? GetVirtualTimeDomain()
: nullptr)));
- loading_task_runners_.insert(loading_task_queue);
- loading_task_queue->SetQueueEnabled(
+ auto insert_result = loading_task_runners_.insert(std::make_pair(
+ loading_task_queue, loading_task_queue->CreateQueueEnabledVoter()));
+ insert_result.first->second->SetQueueEnabled(
MainThreadOnly().current_policy.loading_queue_policy.is_enabled);
loading_task_queue->SetQueuePriority(
MainThreadOnly().current_policy.loading_queue_policy.priority);
@@ -310,8 +312,9 @@ scoped_refptr<TaskQueue> RendererSchedulerImpl::NewTimerTaskRunner(
.SetTimeDomain(MainThreadOnly().use_virtual_time
? GetVirtualTimeDomain()
: nullptr)));
- timer_task_runners_.insert(timer_task_queue);
- timer_task_queue->SetQueueEnabled(
+ auto insert_result = timer_task_runners_.insert(std::make_pair(
+ timer_task_queue, timer_task_queue->CreateQueueEnabledVoter()));
+ insert_result.first->second->SetQueueEnabled(
MainThreadOnly().current_policy.timer_queue_policy.is_enabled);
timer_task_queue->SetQueuePriority(
MainThreadOnly().current_policy.timer_queue_policy.priority);
@@ -1093,17 +1096,18 @@ void RendererSchedulerImpl::UpdatePolicyLocked(UpdateType update_type) {
}
ApplyTaskQueuePolicy(compositor_task_runner_.get(),
+ compositor_task_runner_enabled_voter_.get(),
MainThreadOnly().current_policy.compositor_queue_policy,
new_policy.compositor_queue_policy);
- for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) {
- ApplyTaskQueuePolicy(loading_queue.get(),
+ for (const auto& pair : loading_task_runners_) {
+ ApplyTaskQueuePolicy(pair.first.get(), pair.second.get(),
MainThreadOnly().current_policy.loading_queue_policy,
new_policy.loading_queue_policy);
}
- for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) {
- ApplyTaskQueuePolicy(timer_queue.get(),
+ for (const auto& pair : timer_task_runners_) {
+ ApplyTaskQueuePolicy(pair.first.get(), pair.second.get(),
MainThreadOnly().current_policy.timer_queue_policy,
new_policy.timer_queue_policy);
}
@@ -1113,7 +1117,7 @@ void RendererSchedulerImpl::UpdatePolicyLocked(UpdateType update_type) {
// 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
// are mostly dispatched on the default queue) need to be preserved.
- ApplyTaskQueuePolicy(helper_.DefaultTaskRunner().get(),
+ ApplyTaskQueuePolicy(helper_.DefaultTaskRunner().get(), nullptr,
MainThreadOnly().current_policy.default_queue_policy,
new_policy.default_queue_policy);
if (MainThreadOnly().rail_mode_observer &&
@@ -1137,12 +1141,17 @@ void RendererSchedulerImpl::UpdatePolicyLocked(UpdateType update_type) {
void RendererSchedulerImpl::ApplyTaskQueuePolicy(
TaskQueue* task_queue,
+ TaskQueue::QueueEnabledVoter* task_queue_enabled_voter,
const TaskQueuePolicy& old_task_queue_policy,
const TaskQueuePolicy& new_task_queue_policy) const {
- if (old_task_queue_policy.is_enabled != new_task_queue_policy.is_enabled) {
- task_queue->SetQueueEnabled(new_task_queue_policy.is_enabled);
+ if (task_queue_enabled_voter &&
+ old_task_queue_policy.is_enabled != new_task_queue_policy.is_enabled) {
+ task_queue_enabled_voter->SetQueueEnabled(new_task_queue_policy.is_enabled);
}
+ // Make sure if there's no voter that the task queue is enabled.
+ DCHECK(task_queue_enabled_voter || old_task_queue_policy.is_enabled);
+
if (old_task_queue_policy.priority != new_task_queue_policy.priority)
task_queue->SetQueuePriority(new_task_queue_policy.priority);
@@ -1274,7 +1283,7 @@ void RendererSchedulerImpl::SuspendTimerQueue() {
#ifndef NDEBUG
DCHECK(!default_timer_task_runner_->IsQueueEnabled());
for (const auto& runner : timer_task_runners_) {
- DCHECK(!runner->IsQueueEnabled());
+ DCHECK(!runner.first->IsQueueEnabled());
}
#endif
}

Powered by Google App Engine
This is Rietveld 408576698