Commit 84647252 authored by Katie Dillon's avatar Katie Dillon Committed by Commit Bot

[scheduling] Remove fixed priority.

This CL removed fixed priority from the scheduler in favor of using
PrioritisationType to make priority decisions. This centralizes
priority to ComputePriority/PrioritisationType. Specifically, this CL
has kBestEffort queues use kBestEffort PrioritisationType and adds
kInput PrioritisationType for input queues.

Change-Id: Icaabc29ff6d3d8f5595c64741056899ffa474fff
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2376574
Commit-Queue: Katie Dillon <kdillon@chromium.org>
Reviewed-by: default avatarScott Haseley <shaseley@chromium.org>
Cr-Commit-Position: refs/heads/master@{#808044}
parent 4c6c1dc5
...@@ -1005,11 +1005,18 @@ TaskQueue::QueuePriority FrameSchedulerImpl::ComputePriority( ...@@ -1005,11 +1005,18 @@ TaskQueue::QueuePriority FrameSchedulerImpl::ComputePriority(
if (queue_priority_pair != resource_loading_task_queue_priorities_.end()) if (queue_priority_pair != resource_loading_task_queue_priorities_.end())
return queue_priority_pair->value; return queue_priority_pair->value;
base::Optional<TaskQueue::QueuePriority> fixed_priority = // TODO(kdillon): Ordering here is relative to the experiments below. Cleanup
task_queue->FixedPriority(); // unused experiment logic so that this switch can be merged with the
// prioritisation type decisions below.
if (fixed_priority) switch (task_queue->GetPrioritisationType()) {
return fixed_priority.value(); case MainThreadTaskQueue::QueueTraits::PrioritisationType::
kInternalScriptContinuation:
return TaskQueue::QueuePriority::kVeryHighPriority;
case MainThreadTaskQueue::QueueTraits::PrioritisationType::kBestEffort:
return TaskQueue::QueuePriority::kBestEffortPriority;
default:
break;
}
// TODO(shaseley): This should use lower priorities if the frame is // TODO(shaseley): This should use lower priorities if the frame is
// deprioritized. Change this once we refactor and add frame policy/priorities // deprioritized. Change this once we refactor and add frame policy/priorities
......
...@@ -2428,9 +2428,8 @@ TEST_F(FrameSchedulerImplDatabaseAccessWithHighPriority, ...@@ -2428,9 +2428,8 @@ TEST_F(FrameSchedulerImplDatabaseAccessWithHighPriority,
TEST_F(FrameSchedulerImplTest, ContentCaptureHasIdleTaskQueue) { TEST_F(FrameSchedulerImplTest, ContentCaptureHasIdleTaskQueue) {
auto task_queue = GetTaskQueue(TaskType::kInternalContentCapture); auto task_queue = GetTaskQueue(TaskType::kInternalContentCapture);
EXPECT_TRUE(task_queue->FixedPriority().has_value());
EXPECT_EQ(TaskQueue::QueuePriority::kBestEffortPriority, EXPECT_EQ(TaskQueue::QueuePriority::kBestEffortPriority,
task_queue->FixedPriority().value()); task_queue->GetQueuePriority());
} }
TEST_F(FrameSchedulerImplTest, ComputePriorityForDetachedFrame) { TEST_F(FrameSchedulerImplTest, ComputePriorityForDetachedFrame) {
......
...@@ -102,19 +102,6 @@ void FrameTaskQueueController::CreateTaskQueue( ...@@ -102,19 +102,6 @@ void FrameTaskQueueController::CreateTaskQueue(
.SetFreezeWhenKeepActive(queue_traits.can_be_throttled) .SetFreezeWhenKeepActive(queue_traits.can_be_throttled)
.SetFrameScheduler(frame_scheduler_impl_); .SetFrameScheduler(frame_scheduler_impl_);
switch (queue_traits.prioritisation_type) {
case QueueTraits::PrioritisationType::kInternalScriptContinuation:
queue_creation_params = queue_creation_params.SetFixedPriority(
TaskQueue::QueuePriority::kVeryHighPriority);
break;
case QueueTraits::PrioritisationType::kBestEffort:
queue_creation_params = queue_creation_params.SetFixedPriority(
TaskQueue::QueuePriority::kBestEffortPriority);
break;
default:
break;
}
scoped_refptr<MainThreadTaskQueue> task_queue = scoped_refptr<MainThreadTaskQueue> task_queue =
main_thread_scheduler_impl_->NewTaskQueue(queue_creation_params); main_thread_scheduler_impl_->NewTaskQueue(queue_creation_params);
TaskQueueCreated(task_queue); TaskQueueCreated(task_queue);
......
...@@ -332,7 +332,8 @@ INSTANTIATE_TEST_SUITE_P( ...@@ -332,7 +332,8 @@ INSTANTIATE_TEST_SUITE_P(
QueueTraits::PrioritisationType::kFindInPage, QueueTraits::PrioritisationType::kFindInPage,
QueueTraits::PrioritisationType::kExperimentalDatabase, QueueTraits::PrioritisationType::kExperimentalDatabase,
QueueTraits::PrioritisationType::kJavaScriptTimer, QueueTraits::PrioritisationType::kJavaScriptTimer,
QueueTraits::PrioritisationType::kHighPriorityLocalFrame)); QueueTraits::PrioritisationType::kHighPriorityLocalFrame,
QueueTraits::PrioritisationType::kInput));
TEST_P(TaskQueueCreationFromQueueTraitsTest, TEST_P(TaskQueueCreationFromQueueTraitsTest,
AddAndRetrieveAllTaskQueues) { AddAndRetrieveAllTaskQueues) {
......
...@@ -78,8 +78,6 @@ scoped_refptr<MainThreadTaskQueue> MainThreadSchedulerHelper::NewTaskQueue( ...@@ -78,8 +78,6 @@ scoped_refptr<MainThreadTaskQueue> MainThreadSchedulerHelper::NewTaskQueue(
scoped_refptr<MainThreadTaskQueue> task_queue = scoped_refptr<MainThreadTaskQueue> task_queue =
sequence_manager_->CreateTaskQueueWithType<MainThreadTaskQueue>( sequence_manager_->CreateTaskQueueWithType<MainThreadTaskQueue>(
params.spec, params, main_thread_scheduler_); params.spec, params, main_thread_scheduler_);
if (params.fixed_priority)
task_queue->SetQueuePriority(params.fixed_priority.value());
return task_queue; return task_queue;
} }
......
...@@ -183,15 +183,16 @@ MainThreadSchedulerImpl::MainThreadSchedulerImpl( ...@@ -183,15 +183,16 @@ MainThreadSchedulerImpl::MainThreadSchedulerImpl(
base::Optional<base::Time> initial_virtual_time) base::Optional<base::Time> initial_virtual_time)
: sequence_manager_(std::move(sequence_manager)), : sequence_manager_(std::move(sequence_manager)),
helper_(sequence_manager_.get(), this), helper_(sequence_manager_.get(), this),
idle_helper_(&helper_, idle_helper_(
this, &helper_,
"MainThreadSchedulerIdlePeriod", this,
base::TimeDelta(), "MainThreadSchedulerIdlePeriod",
helper_.NewTaskQueue( base::TimeDelta(),
MainThreadTaskQueue::QueueCreationParams( helper_.NewTaskQueue(
MainThreadTaskQueue::QueueType::kIdle) MainThreadTaskQueue::QueueCreationParams(
.SetFixedPriority( MainThreadTaskQueue::QueueType::kIdle)
TaskQueue::QueuePriority::kBestEffortPriority))), .SetPrioritisationType(MainThreadTaskQueue::QueueTraits::
PrioritisationType::kBestEffort))),
render_widget_scheduler_signals_(this), render_widget_scheduler_signals_(this),
find_in_page_budget_pool_controller_( find_in_page_budget_pool_controller_(
new FindInPageBudgetPoolController(this)), new FindInPageBudgetPoolController(this)),
...@@ -207,8 +208,8 @@ MainThreadSchedulerImpl::MainThreadSchedulerImpl( ...@@ -207,8 +208,8 @@ MainThreadSchedulerImpl::MainThreadSchedulerImpl(
memory_purge_task_queue_(helper_.NewTaskQueue( memory_purge_task_queue_(helper_.NewTaskQueue(
MainThreadTaskQueue::QueueCreationParams( MainThreadTaskQueue::QueueCreationParams(
MainThreadTaskQueue::QueueType::kIdle) MainThreadTaskQueue::QueueType::kIdle)
.SetFixedPriority( .SetPrioritisationType(MainThreadTaskQueue::QueueTraits::
TaskQueue::QueuePriority::kBestEffortPriority))), PrioritisationType::kBestEffort))),
memory_purge_manager_(memory_purge_task_queue_->CreateTaskRunner( memory_purge_manager_(memory_purge_task_queue_->CreateTaskRunner(
TaskType::kMainThreadTaskQueueMemoryPurge)), TaskType::kMainThreadTaskQueueMemoryPurge)),
non_waking_time_domain_(tick_clock()), non_waking_time_domain_(tick_clock()),
...@@ -296,6 +297,11 @@ MainThreadSchedulerImpl::MainThreadSchedulerImpl( ...@@ -296,6 +297,11 @@ MainThreadSchedulerImpl::MainThreadSchedulerImpl(
find_in_page_budget_pool_controller_->CurrentTaskPriority(); find_in_page_budget_pool_controller_->CurrentTaskPriority();
g_main_thread_scheduler = this; g_main_thread_scheduler = this;
// Explicitly set the priority of this queue since it is not managed by
// the main thread scheduler.
memory_purge_task_queue_->SetQueuePriority(
ComputePriority(memory_purge_task_queue_.get()));
} }
MainThreadSchedulerImpl::~MainThreadSchedulerImpl() { MainThreadSchedulerImpl::~MainThreadSchedulerImpl() {
...@@ -2614,19 +2620,19 @@ TaskQueue::QueuePriority MainThreadSchedulerImpl::ComputePriority( ...@@ -2614,19 +2620,19 @@ TaskQueue::QueuePriority MainThreadSchedulerImpl::ComputePriority(
return frame_scheduler->ComputePriority(task_queue); return frame_scheduler->ComputePriority(task_queue);
} }
base::Optional<TaskQueue::QueuePriority> fixed_priority = switch (task_queue->GetPrioritisationType()) {
task_queue->FixedPriority(); case MainThreadTaskQueue::QueueTraits::PrioritisationType::kCompositor:
if (fixed_priority) { return main_thread_only().compositor_priority;
return fixed_priority.value(); case MainThreadTaskQueue::QueueTraits::PrioritisationType::kInput:
} return TaskQueue::QueuePriority::kHighestPriority;
case MainThreadTaskQueue::QueueTraits::PrioritisationType::kBestEffort:
if (task_queue->GetPrioritisationType() == return TaskQueue::QueuePriority::kBestEffortPriority;
MainThreadTaskQueue::QueueTraits::PrioritisationType::kCompositor) { case MainThreadTaskQueue::QueueTraits::PrioritisationType::kRegular:
return main_thread_only().compositor_priority; return TaskQueue::QueuePriority::kNormalPriority;
default:
NOTREACHED();
return TaskQueue::QueuePriority::kNormalPriority;
} }
// Default priority.
return TaskQueue::QueuePriority::kNormalPriority;
} }
void MainThreadSchedulerImpl::OnBeginNestedRunLoop() { void MainThreadSchedulerImpl::OnBeginNestedRunLoop() {
......
...@@ -107,7 +107,6 @@ MainThreadTaskQueue::MainThreadTaskQueue( ...@@ -107,7 +107,6 @@ MainThreadTaskQueue::MainThreadTaskQueue(
MainThreadSchedulerImpl* main_thread_scheduler) MainThreadSchedulerImpl* main_thread_scheduler)
: TaskQueue(std::move(impl), spec), : TaskQueue(std::move(impl), spec),
queue_type_(params.queue_type), queue_type_(params.queue_type),
fixed_priority_(params.fixed_priority),
queue_traits_(params.queue_traits), queue_traits_(params.queue_traits),
freeze_when_keep_active_(params.freeze_when_keep_active), freeze_when_keep_active_(params.freeze_when_keep_active),
web_scheduling_priority_(params.web_scheduling_priority), web_scheduling_priority_(params.web_scheduling_priority),
......
...@@ -121,8 +121,9 @@ class PLATFORM_EXPORT MainThreadTaskQueue ...@@ -121,8 +121,9 @@ class PLATFORM_EXPORT MainThreadTaskQueue
kJavaScriptTimer = 7, kJavaScriptTimer = 7,
kHighPriorityLocalFrame = 8, kHighPriorityLocalFrame = 8,
kCompositor = 9, // Main-thread only. kCompositor = 9, // Main-thread only.
kInput = 10,
kCount = 10 kCount = 11
}; };
// kPrioritisationTypeWidthBits is the number of bits required // kPrioritisationTypeWidthBits is the number of bits required
...@@ -226,13 +227,6 @@ class PLATFORM_EXPORT MainThreadTaskQueue ...@@ -226,13 +227,6 @@ class PLATFORM_EXPORT MainThreadTaskQueue
frame_scheduler(nullptr), frame_scheduler(nullptr),
freeze_when_keep_active(false) {} freeze_when_keep_active(false) {}
QueueCreationParams SetFixedPriority(
base::Optional<base::sequence_manager::TaskQueue::QueuePriority>
priority) {
fixed_priority = priority;
return *this;
}
QueueCreationParams SetFreezeWhenKeepActive(bool value) { QueueCreationParams SetFreezeWhenKeepActive(bool value) {
freeze_when_keep_active = value; freeze_when_keep_active = value;
return *this; return *this;
...@@ -319,8 +313,6 @@ class PLATFORM_EXPORT MainThreadTaskQueue ...@@ -319,8 +313,6 @@ class PLATFORM_EXPORT MainThreadTaskQueue
QueueType queue_type; QueueType queue_type;
base::sequence_manager::TaskQueue::Spec spec; base::sequence_manager::TaskQueue::Spec spec;
base::Optional<base::sequence_manager::TaskQueue::QueuePriority>
fixed_priority;
FrameSchedulerImpl* frame_scheduler; FrameSchedulerImpl* frame_scheduler;
QueueTraits queue_traits; QueueTraits queue_traits;
bool freeze_when_keep_active; bool freeze_when_keep_active;
...@@ -336,11 +328,6 @@ class PLATFORM_EXPORT MainThreadTaskQueue ...@@ -336,11 +328,6 @@ class PLATFORM_EXPORT MainThreadTaskQueue
QueueType queue_type() const { return queue_type_; } QueueType queue_type() const { return queue_type_; }
base::Optional<base::sequence_manager::TaskQueue::QueuePriority>
FixedPriority() const {
return fixed_priority_;
}
bool CanBeDeferred() const { return queue_traits_.can_be_deferred; } bool CanBeDeferred() const { return queue_traits_.can_be_deferred; }
bool CanBeThrottled() const { return queue_traits_.can_be_throttled; } bool CanBeThrottled() const { return queue_traits_.can_be_throttled; }
...@@ -437,8 +424,6 @@ class PLATFORM_EXPORT MainThreadTaskQueue ...@@ -437,8 +424,6 @@ class PLATFORM_EXPORT MainThreadTaskQueue
void ClearReferencesToSchedulers(); void ClearReferencesToSchedulers();
const QueueType queue_type_; const QueueType queue_type_;
const base::Optional<base::sequence_manager::TaskQueue::QueuePriority>
fixed_priority_;
const QueueTraits queue_traits_; const QueueTraits queue_traits_;
const bool freeze_when_keep_active_; const bool freeze_when_keep_active_;
......
...@@ -15,8 +15,8 @@ WidgetScheduler::WidgetScheduler( ...@@ -15,8 +15,8 @@ WidgetScheduler::WidgetScheduler(
MainThreadTaskQueue::QueueCreationParams( MainThreadTaskQueue::QueueCreationParams(
MainThreadTaskQueue::QueueType::kInput) MainThreadTaskQueue::QueueType::kInput)
.SetShouldMonitorQuiescence(true) .SetShouldMonitorQuiescence(true)
.SetFixedPriority( .SetPrioritisationType(
base::make_optional(TaskQueue::QueuePriority::kHighestPriority))); MainThreadTaskQueue::QueueTraits::PrioritisationType::kInput));
input_task_runner_ = input_task_runner_ =
input_task_queue_->CreateTaskRunner(TaskType::kMainThreadTaskQueueInput); input_task_queue_->CreateTaskRunner(TaskType::kMainThreadTaskQueueInput);
input_task_queue_enabled_voter_ = input_task_queue_enabled_voter_ =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment