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

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

Issue 2471153002: [scheduler] Use Finch to control background throttling. (Closed)
Patch Set: 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "platform/scheduler/renderer/task_queue_throttler.h" 5 #include "platform/scheduler/renderer/task_queue_throttler.h"
6 6
7 #include <cstdint> 7 #include <cstdint>
8 8
9 #include "base/format_macros.h" 9 #include "base/format_macros.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "base/optional.h" 12 #include "base/optional.h"
13 #include "base/strings/stringprintf.h" 13 #include "base/strings/stringprintf.h"
14 #include "platform/scheduler/base/real_time_domain.h" 14 #include "platform/scheduler/base/real_time_domain.h"
15 #include "platform/scheduler/child/scheduler_tqm_delegate.h" 15 #include "platform/scheduler/child/scheduler_tqm_delegate.h"
16 #include "platform/scheduler/renderer/auto_advancing_virtual_time_domain.h" 16 #include "platform/scheduler/renderer/auto_advancing_virtual_time_domain.h"
17 #include "platform/scheduler/renderer/renderer_scheduler_impl.h" 17 #include "platform/scheduler/renderer/renderer_scheduler_impl.h"
18 #include "platform/scheduler/renderer/throttled_time_domain.h" 18 #include "platform/scheduler/renderer/throttled_time_domain.h"
19 #include "platform/scheduler/renderer/web_frame_scheduler_impl.h" 19 #include "platform/scheduler/renderer/web_frame_scheduler_impl.h"
20 #include "public/platform/WebFrameScheduler.h" 20 #include "public/platform/WebFrameScheduler.h"
21 21
22 namespace blink { 22 namespace blink {
23 namespace scheduler { 23 namespace scheduler {
24 24
25 namespace { 25 namespace {
26 constexpr base::TimeDelta kMaxBudgetLevel = base::TimeDelta::FromSeconds(1);
27 constexpr base::TimeDelta kMaxThrottlingDuration =
28 base::TimeDelta::FromMinutes(1);
29 26
30 base::Optional<base::TimeTicks> NextTaskRunTime(LazyNow* lazy_now, 27 base::Optional<base::TimeTicks> NextTaskRunTime(LazyNow* lazy_now,
31 TaskQueue* queue) { 28 TaskQueue* queue) {
32 if (queue->HasPendingImmediateWork()) 29 if (queue->HasPendingImmediateWork())
33 return lazy_now->Now(); 30 return lazy_now->Now();
34 return queue->GetNextScheduledWakeUp(); 31 return queue->GetNextScheduledWakeUp();
35 } 32 }
36 33
37 template <class T> 34 template <class T>
38 T Min(const base::Optional<T>& optional, const T& value) { 35 T Min(const base::Optional<T>& optional, const T& value) {
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 // TODO(altimin): Control max_budget_level and max_throttling_duration 249 // TODO(altimin): Control max_budget_level and max_throttling_duration
253 // from Finch. 250 // from Finch.
254 TaskQueueThrottler::TaskQueueThrottler( 251 TaskQueueThrottler::TaskQueueThrottler(
255 RendererSchedulerImpl* renderer_scheduler, 252 RendererSchedulerImpl* renderer_scheduler,
256 const char* tracing_category) 253 const char* tracing_category)
257 : task_runner_(renderer_scheduler->ControlTaskRunner()), 254 : task_runner_(renderer_scheduler->ControlTaskRunner()),
258 renderer_scheduler_(renderer_scheduler), 255 renderer_scheduler_(renderer_scheduler),
259 tick_clock_(renderer_scheduler->tick_clock()), 256 tick_clock_(renderer_scheduler->tick_clock()),
260 tracing_category_(tracing_category), 257 tracing_category_(tracing_category),
261 time_domain_(new ThrottledTimeDomain(this, tracing_category)), 258 time_domain_(new ThrottledTimeDomain(this, tracing_category)),
262 max_budget_level_(kMaxBudgetLevel),
263 max_throttling_duration_(kMaxThrottlingDuration),
264 virtual_time_(false), 259 virtual_time_(false),
265 weak_factory_(this) { 260 weak_factory_(this) {
266 pump_throttled_tasks_closure_.Reset(base::Bind( 261 pump_throttled_tasks_closure_.Reset(base::Bind(
267 &TaskQueueThrottler::PumpThrottledTasks, weak_factory_.GetWeakPtr())); 262 &TaskQueueThrottler::PumpThrottledTasks, weak_factory_.GetWeakPtr()));
268 forward_immediate_work_callback_ = 263 forward_immediate_work_callback_ =
269 base::Bind(&TaskQueueThrottler::OnTimeDomainHasImmediateWork, 264 base::Bind(&TaskQueueThrottler::OnTimeDomainHasImmediateWork,
270 weak_factory_.GetWeakPtr()); 265 weak_factory_.GetWeakPtr());
271 266
272 renderer_scheduler_->RegisterTimeDomain(time_domain_.get()); 267 renderer_scheduler_->RegisterTimeDomain(time_domain_.get());
273 } 268 }
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 it++; 516 it++;
522 } 517 }
523 518
524 task_queue->SetTimeDomain(renderer_scheduler_->GetVirtualTimeDomain()); 519 task_queue->SetTimeDomain(renderer_scheduler_->GetVirtualTimeDomain());
525 task_queue->RemoveFence(); 520 task_queue->RemoveFence();
526 task_queue->SetQueueEnabled(enabled); 521 task_queue->SetQueueEnabled(enabled);
527 } 522 }
528 } 523 }
529 524
530 TaskQueueThrottler::TimeBudgetPool* TaskQueueThrottler::CreateTimeBudgetPool( 525 TaskQueueThrottler::TimeBudgetPool* TaskQueueThrottler::CreateTimeBudgetPool(
531 const char* name) { 526 const char* name,
527 base::Optional<base::TimeDelta> max_budget_level,
528 base::Optional<base::TimeDelta> max_throttling_duration) {
532 TimeBudgetPool* time_budget_pool = 529 TimeBudgetPool* time_budget_pool =
533 new TimeBudgetPool(name, this, tick_clock_->NowTicks(), max_budget_level_, 530 new TimeBudgetPool(name, this, tick_clock_->NowTicks(), max_budget_level,
534 max_throttling_duration_); 531 max_throttling_duration);
535 time_budget_pools_[time_budget_pool] = base::WrapUnique(time_budget_pool); 532 time_budget_pools_[time_budget_pool] = base::WrapUnique(time_budget_pool);
536 return time_budget_pool; 533 return time_budget_pool;
537 } 534 }
538 535
539 void TaskQueueThrottler::OnTaskRunTimeReported(TaskQueue* task_queue, 536 void TaskQueueThrottler::OnTaskRunTimeReported(TaskQueue* task_queue,
540 base::TimeTicks start_time, 537 base::TimeTicks start_time,
541 base::TimeTicks end_time) { 538 base::TimeTicks end_time) {
542 if (!IsThrottled(task_queue)) 539 if (!IsThrottled(task_queue))
543 return; 540 return;
544 541
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 return std::max(now, time_budget_pool->GetNextAllowedRunTime()); 596 return std::max(now, time_budget_pool->GetNextAllowedRunTime());
600 } 597 }
601 598
602 void TaskQueueThrottler::MaybeDeleteQueueMetadata(TaskQueueMap::iterator it) { 599 void TaskQueueThrottler::MaybeDeleteQueueMetadata(TaskQueueMap::iterator it) {
603 if (!it->second.IsThrottled() && !it->second.time_budget_pool) 600 if (!it->second.IsThrottled() && !it->second.time_budget_pool)
604 queue_details_.erase(it); 601 queue_details_.erase(it);
605 } 602 }
606 603
607 } // namespace scheduler 604 } // namespace scheduler
608 } // namespace blink 605 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698