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

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

Issue 2798563003: [scheduler] Add TaskQueue::Observer (Closed)
Patch Set: Rebased Created 3 years, 8 months 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/task_queue_throttler.cc
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc
index 289893c700a258000988ebdc952d32ea22dbdff9..e9744e259d6f4b2ed021c828e9b90c8a4e1df9e1 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc
@@ -79,13 +79,13 @@ TaskQueueThrottler::TaskQueueThrottler(
renderer_scheduler_(renderer_scheduler),
tick_clock_(renderer_scheduler->tick_clock()),
tracing_category_(tracing_category),
- time_domain_(new ThrottledTimeDomain(this, tracing_category)),
+ time_domain_(new ThrottledTimeDomain(tracing_category)),
allow_throttling_(true),
weak_factory_(this) {
pump_throttled_tasks_closure_.Reset(base::Bind(
&TaskQueueThrottler::PumpThrottledTasks, weak_factory_.GetWeakPtr()));
forward_immediate_work_callback_ =
- base::Bind(&TaskQueueThrottler::OnTimeDomainHasImmediateWork,
+ base::Bind(&TaskQueueThrottler::OnQueueNextWakeUpChanged,
weak_factory_.GetWeakPtr());
renderer_scheduler_->RegisterTimeDomain(time_domain_.get());
@@ -100,6 +100,8 @@ TaskQueueThrottler::~TaskQueueThrottler() {
task_queue->SetTimeDomain(renderer_scheduler_->real_time_domain());
task_queue->RemoveFence();
}
+ if (map_entry.second.throttling_ref_count != 0)
+ task_queue->SetObserver(nullptr);
}
renderer_scheduler_->UnregisterTimeDomain(time_domain_.get());
@@ -119,6 +121,8 @@ void TaskQueueThrottler::IncreaseThrottleRefCount(TaskQueue* task_queue) {
TRACE_EVENT1(tracing_category_, "TaskQueueThrottler_TaskQueueThrottled",
"task_queue", task_queue);
+ task_queue->SetObserver(this);
+
if (!allow_throttling_)
return;
@@ -131,11 +135,9 @@ void TaskQueueThrottler::IncreaseThrottleRefCount(TaskQueue* task_queue) {
return;
if (!task_queue->IsEmpty()) {
- if (task_queue->HasPendingImmediateWork()) {
- OnTimeDomainHasImmediateWork(task_queue);
- } else {
- OnTimeDomainHasDelayedWork(task_queue);
- }
+ LazyNow lazy_now(tick_clock_);
+ OnQueueNextWakeUpChanged(task_queue,
+ NextTaskRunTime(&lazy_now, task_queue).value());
}
}
@@ -150,6 +152,8 @@ void TaskQueueThrottler::DecreaseThrottleRefCount(TaskQueue* task_queue) {
TRACE_EVENT1(tracing_category_, "TaskQueueThrottler_TaskQueueUnthrottled",
"task_queue", task_queue);
+ task_queue->SetObserver(nullptr);
+
MaybeDeleteQueueMetadata(iter);
if (!allow_throttling_)
@@ -183,17 +187,22 @@ void TaskQueueThrottler::UnregisterTaskQueue(TaskQueue* task_queue) {
// Iterator may have been deleted by BudgetPool::RemoveQueue, so don't
// use it here.
queue_details_.erase(task_queue);
+
+ // NOTE: Observer is automatically unregistered when unregistering task queue.
}
-void TaskQueueThrottler::OnTimeDomainHasImmediateWork(TaskQueue* queue) {
- // Forward to the main thread if called from another thread
+void TaskQueueThrottler::OnQueueNextWakeUpChanged(
+ TaskQueue* queue,
+ base::TimeTicks next_wake_up) {
if (!task_runner_->RunsTasksOnCurrentThread()) {
- task_runner_->PostTask(FROM_HERE,
- base::Bind(forward_immediate_work_callback_, queue));
+ task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(forward_immediate_work_callback_, queue, next_wake_up));
return;
}
+
TRACE_EVENT0(tracing_category_,
- "TaskQueueThrottler::OnTimeDomainHasImmediateWork");
+ "TaskQueueThrottler::OnQueueNextWakeUpChanged");
// We don't expect this to get called for disabled queues, but we can't DCHECK
// because of the above thread hop. Just bail out if the queue is disabled.
@@ -201,22 +210,9 @@ void TaskQueueThrottler::OnTimeDomainHasImmediateWork(TaskQueue* queue) {
return;
base::TimeTicks now = tick_clock_->NowTicks();
- base::TimeTicks next_allowed_run_time = GetNextAllowedRunTime(now, queue);
- MaybeSchedulePumpThrottledTasks(FROM_HERE, now, next_allowed_run_time);
-}
-
-void TaskQueueThrottler::OnTimeDomainHasDelayedWork(TaskQueue* queue) {
- TRACE_EVENT0(tracing_category_,
- "TaskQueueThrottler::OnTimeDomainHasDelayedWork");
- DCHECK(queue->IsQueueEnabled());
- base::TimeTicks now = tick_clock_->NowTicks();
- LazyNow lazy_now(now);
-
- base::Optional<base::TimeTicks> next_scheduled_delayed_task =
- NextTaskRunTime(&lazy_now, queue);
- DCHECK(next_scheduled_delayed_task);
- MaybeSchedulePumpThrottledTasks(FROM_HERE, now,
- next_scheduled_delayed_task.value());
+ MaybeSchedulePumpThrottledTasks(
+ FROM_HERE, now,
+ std::max(GetNextAllowedRunTime(now, queue), next_wake_up));
}
void TaskQueueThrottler::PumpThrottledTasks() {

Powered by Google App Engine
This is Rietveld 408576698