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

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: Fix test and address comments 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/renderer_scheduler_impl.h" 16 #include "platform/scheduler/renderer/renderer_scheduler_impl.h"
17 #include "platform/scheduler/renderer/throttled_time_domain.h" 17 #include "platform/scheduler/renderer/throttled_time_domain.h"
18 #include "platform/scheduler/renderer/web_frame_scheduler_impl.h" 18 #include "platform/scheduler/renderer/web_frame_scheduler_impl.h"
19 #include "public/platform/WebFrameScheduler.h" 19 #include "public/platform/WebFrameScheduler.h"
20 20
21 namespace blink { 21 namespace blink {
22 namespace scheduler { 22 namespace scheduler {
23 23
24 namespace { 24 namespace {
25 constexpr base::TimeDelta kMaxBudgetLevel = base::TimeDelta::FromSeconds(1);
26 constexpr base::TimeDelta kMaxThrottlingDuration =
27 base::TimeDelta::FromMinutes(1);
28 25
29 base::Optional<base::TimeTicks> NextTaskRunTime(LazyNow* lazy_now, 26 base::Optional<base::TimeTicks> NextTaskRunTime(LazyNow* lazy_now,
30 TaskQueue* queue) { 27 TaskQueue* queue) {
31 if (queue->HasPendingImmediateWork()) 28 if (queue->HasPendingImmediateWork())
32 return lazy_now->Now(); 29 return lazy_now->Now();
33 return queue->GetNextScheduledWakeUp(); 30 return queue->GetNextScheduledWakeUp();
34 } 31 }
35 32
36 template <class T> 33 template <class T>
37 T Min(const base::Optional<T>& optional, const T& value) { 34 T Min(const base::Optional<T>& optional, const T& value) {
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 // TODO(altimin): Control max_budget_level and max_throttling_duration 262 // TODO(altimin): Control max_budget_level and max_throttling_duration
266 // from Finch. 263 // from Finch.
267 TaskQueueThrottler::TaskQueueThrottler( 264 TaskQueueThrottler::TaskQueueThrottler(
268 RendererSchedulerImpl* renderer_scheduler, 265 RendererSchedulerImpl* renderer_scheduler,
269 const char* tracing_category) 266 const char* tracing_category)
270 : task_runner_(renderer_scheduler->ControlTaskRunner()), 267 : task_runner_(renderer_scheduler->ControlTaskRunner()),
271 renderer_scheduler_(renderer_scheduler), 268 renderer_scheduler_(renderer_scheduler),
272 tick_clock_(renderer_scheduler->tick_clock()), 269 tick_clock_(renderer_scheduler->tick_clock()),
273 tracing_category_(tracing_category), 270 tracing_category_(tracing_category),
274 time_domain_(new ThrottledTimeDomain(this, tracing_category)), 271 time_domain_(new ThrottledTimeDomain(this, tracing_category)),
275 max_budget_level_(kMaxBudgetLevel),
276 max_throttling_duration_(kMaxThrottlingDuration),
277 allow_throttling_(true), 272 allow_throttling_(true),
278 weak_factory_(this) { 273 weak_factory_(this) {
279 pump_throttled_tasks_closure_.Reset(base::Bind( 274 pump_throttled_tasks_closure_.Reset(base::Bind(
280 &TaskQueueThrottler::PumpThrottledTasks, weak_factory_.GetWeakPtr())); 275 &TaskQueueThrottler::PumpThrottledTasks, weak_factory_.GetWeakPtr()));
281 forward_immediate_work_callback_ = 276 forward_immediate_work_callback_ =
282 base::Bind(&TaskQueueThrottler::OnTimeDomainHasImmediateWork, 277 base::Bind(&TaskQueueThrottler::OnTimeDomainHasImmediateWork,
283 weak_factory_.GetWeakPtr()); 278 weak_factory_.GetWeakPtr());
284 279
285 renderer_scheduler_->RegisterTimeDomain(time_domain_.get()); 280 renderer_scheduler_->RegisterTimeDomain(time_domain_.get());
286 } 281 }
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
508 503
509 base::TimeDelta delay = pending_pump_throttled_tasks_runtime_.value() - now; 504 base::TimeDelta delay = pending_pump_throttled_tasks_runtime_.value() - now;
510 TRACE_EVENT1(tracing_category_, 505 TRACE_EVENT1(tracing_category_,
511 "TaskQueueThrottler::MaybeSchedulePumpThrottledTasks", 506 "TaskQueueThrottler::MaybeSchedulePumpThrottledTasks",
512 "delay_till_next_pump_ms", delay.InMilliseconds()); 507 "delay_till_next_pump_ms", delay.InMilliseconds());
513 task_runner_->PostDelayedTask( 508 task_runner_->PostDelayedTask(
514 from_here, pump_throttled_tasks_closure_.callback(), delay); 509 from_here, pump_throttled_tasks_closure_.callback(), delay);
515 } 510 }
516 511
517 TaskQueueThrottler::TimeBudgetPool* TaskQueueThrottler::CreateTimeBudgetPool( 512 TaskQueueThrottler::TimeBudgetPool* TaskQueueThrottler::CreateTimeBudgetPool(
518 const char* name) { 513 const char* name,
514 base::Optional<base::TimeDelta> max_budget_level,
515 base::Optional<base::TimeDelta> max_throttling_duration) {
519 TimeBudgetPool* time_budget_pool = 516 TimeBudgetPool* time_budget_pool =
520 new TimeBudgetPool(name, this, tick_clock_->NowTicks(), max_budget_level_, 517 new TimeBudgetPool(name, this, tick_clock_->NowTicks(), max_budget_level,
521 max_throttling_duration_); 518 max_throttling_duration);
522 time_budget_pools_[time_budget_pool] = base::WrapUnique(time_budget_pool); 519 time_budget_pools_[time_budget_pool] = base::WrapUnique(time_budget_pool);
523 return time_budget_pool; 520 return time_budget_pool;
524 } 521 }
525 522
526 void TaskQueueThrottler::OnTaskRunTimeReported(TaskQueue* task_queue, 523 void TaskQueueThrottler::OnTaskRunTimeReported(TaskQueue* task_queue,
527 base::TimeTicks start_time, 524 base::TimeTicks start_time,
528 base::TimeTicks end_time) { 525 base::TimeTicks end_time) {
529 if (!IsThrottled(task_queue)) 526 if (!IsThrottled(task_queue))
530 return; 527 return;
531 528
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 626
630 queue->SetQueueEnabled(false); 627 queue->SetQueueEnabled(false);
631 queue->SetTimeDomain(time_domain_.get()); 628 queue->SetTimeDomain(time_domain_.get());
632 MaybeSchedulePumpQueue(FROM_HERE, lazy_now.Now(), queue, 629 MaybeSchedulePumpQueue(FROM_HERE, lazy_now.Now(), queue,
633 GetNextAllowedRunTime(lazy_now.Now(), queue)); 630 GetNextAllowedRunTime(lazy_now.Now(), queue));
634 } 631 }
635 } 632 }
636 633
637 } // namespace scheduler 634 } // namespace scheduler
638 } // namespace blink 635 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698