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

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

Issue 2754853003: [scheduler] Support adding one queue to multiple budget pools (Closed)
Patch Set: Address comments Created 3 years, 9 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 4b49ef2afaaf0d99ff2b3f00f9d80b3e5ed05734..8b5b7de6c7c9c5acbc3838db7df297f2a79dd23e 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
@@ -170,16 +170,19 @@ bool TaskQueueThrottler::IsThrottled(TaskQueue* task_queue) const {
}
void TaskQueueThrottler::UnregisterTaskQueue(TaskQueue* task_queue) {
- LazyNow lazy_now(tick_clock_);
auto find_it = queue_details_.find(task_queue);
-
if (find_it == queue_details_.end())
return;
- if (find_it->second.budget_pool)
- find_it->second.budget_pool->RemoveQueue(lazy_now.Now(), task_queue);
+ LazyNow lazy_now(tick_clock_);
+ std::unordered_set<BudgetPool*> budget_pools = find_it->second.budget_pools;
+ for (BudgetPool* budget_pool : budget_pools) {
+ budget_pool->RemoveQueue(lazy_now.Now(), task_queue);
+ }
- queue_details_.erase(find_it);
+ // Iterator may have been deleted by BudgetPool::RemoveQueue, so don't
+ // use it here.
+ queue_details_.erase(task_queue);
}
void TaskQueueThrottler::OnTimeDomainHasImmediateWork(TaskQueue* queue) {
@@ -325,13 +328,15 @@ void TaskQueueThrottler::OnTaskRunTimeReported(TaskQueue* task_queue,
if (!IsThrottled(task_queue))
return;
- BudgetPool* budget_pool = GetBudgetPoolForQueue(task_queue);
- if (!budget_pool)
+ auto find_it = queue_details_.find(task_queue);
+ if (find_it == queue_details_.end())
return;
- budget_pool->RecordTaskRunTime(start_time, end_time);
- if (!budget_pool->HasEnoughBudgetToRun(end_time))
- budget_pool->BlockThrottledQueues(end_time);
+ for (BudgetPool* budget_pool : find_it->second.budget_pools) {
+ budget_pool->RecordTaskRunTime(start_time, end_time);
+ if (!budget_pool->HasEnoughBudgetToRun(end_time))
+ budget_pool->BlockThrottledQueues(end_time);
+ }
}
void TaskQueueThrottler::BlockQueue(base::TimeTicks now, TaskQueue* queue) {
@@ -378,17 +383,20 @@ void TaskQueueThrottler::AddQueueToBudgetPool(TaskQueue* queue,
Metadata& metadata = insert_result.first->second;
- DCHECK(!metadata.budget_pool);
- metadata.budget_pool = budget_pool;
+ DCHECK(metadata.budget_pools.find(budget_pool) ==
+ metadata.budget_pools.end());
+
+ metadata.budget_pools.insert(budget_pool);
}
void TaskQueueThrottler::RemoveQueueFromBudgetPool(TaskQueue* queue,
BudgetPool* budget_pool) {
auto find_it = queue_details_.find(queue);
DCHECK(find_it != queue_details_.end() &&
- find_it->second.budget_pool == budget_pool);
+ find_it->second.budget_pools.find(budget_pool) !=
+ find_it->second.budget_pools.end());
- find_it->second.budget_pool = nullptr;
+ find_it->second.budget_pools.erase(budget_pool);
MaybeDeleteQueueMetadata(find_it);
}
@@ -420,23 +428,24 @@ void TaskQueueThrottler::SchedulePumpQueue(
MaybeSchedulePumpThrottledTasks(from_here, now, next_run_time.value());
}
-BudgetPool* TaskQueueThrottler::GetBudgetPoolForQueue(TaskQueue* queue) {
+base::TimeTicks TaskQueueThrottler::GetNextAllowedRunTime(base::TimeTicks now,
+ TaskQueue* queue) {
+ base::TimeTicks next_run_time = now;
+
auto find_it = queue_details_.find(queue);
if (find_it == queue_details_.end())
- return nullptr;
- return find_it->second.budget_pool;
-}
+ return next_run_time;
-base::TimeTicks TaskQueueThrottler::GetNextAllowedRunTime(base::TimeTicks now,
- TaskQueue* queue) {
- BudgetPool* budget_pool = GetBudgetPoolForQueue(queue);
- if (!budget_pool)
- return now;
- return std::max(now, budget_pool->GetNextAllowedRunTime());
+ for (BudgetPool* budget_pool : find_it->second.budget_pools) {
+ next_run_time =
+ std::max(next_run_time, budget_pool->GetNextAllowedRunTime());
+ }
+
+ return next_run_time;
}
void TaskQueueThrottler::MaybeDeleteQueueMetadata(TaskQueueMap::iterator it) {
- if (it->second.throttling_ref_count == 0 && !it->second.budget_pool)
+ if (it->second.throttling_ref_count == 0 && it->second.budget_pools.empty())
queue_details_.erase(it);
}

Powered by Google App Engine
This is Rietveld 408576698