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

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: Address nits from skyostil@ 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 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
254 // TODO(altimin): Control max_budget_level and max_throttling_duration 251 // TODO(altimin): Control max_budget_level and max_throttling_duration
255 // from Finch. 252 // from Finch.
256 TaskQueueThrottler::TaskQueueThrottler( 253 TaskQueueThrottler::TaskQueueThrottler(
257 RendererSchedulerImpl* renderer_scheduler, 254 RendererSchedulerImpl* renderer_scheduler,
258 const char* tracing_category) 255 const char* tracing_category)
259 : task_runner_(renderer_scheduler->ControlTaskRunner()), 256 : task_runner_(renderer_scheduler->ControlTaskRunner()),
260 renderer_scheduler_(renderer_scheduler), 257 renderer_scheduler_(renderer_scheduler),
261 tick_clock_(renderer_scheduler->tick_clock()), 258 tick_clock_(renderer_scheduler->tick_clock()),
262 tracing_category_(tracing_category), 259 tracing_category_(tracing_category),
263 time_domain_(new ThrottledTimeDomain(this, tracing_category)), 260 time_domain_(new ThrottledTimeDomain(this, tracing_category)),
264 max_budget_level_(kMaxBudgetLevel),
265 max_throttling_duration_(kMaxThrottlingDuration),
266 allow_throttling_(true), 261 allow_throttling_(true),
267 weak_factory_(this) { 262 weak_factory_(this) {
268 pump_throttled_tasks_closure_.Reset(base::Bind( 263 pump_throttled_tasks_closure_.Reset(base::Bind(
269 &TaskQueueThrottler::PumpThrottledTasks, weak_factory_.GetWeakPtr())); 264 &TaskQueueThrottler::PumpThrottledTasks, weak_factory_.GetWeakPtr()));
270 forward_immediate_work_callback_ = 265 forward_immediate_work_callback_ =
271 base::Bind(&TaskQueueThrottler::OnTimeDomainHasImmediateWork, 266 base::Bind(&TaskQueueThrottler::OnTimeDomainHasImmediateWork,
272 weak_factory_.GetWeakPtr()); 267 weak_factory_.GetWeakPtr());
273 268
274 renderer_scheduler_->RegisterTimeDomain(time_domain_.get()); 269 renderer_scheduler_->RegisterTimeDomain(time_domain_.get());
275 } 270 }
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
497 492
498 base::TimeDelta delay = pending_pump_throttled_tasks_runtime_.value() - now; 493 base::TimeDelta delay = pending_pump_throttled_tasks_runtime_.value() - now;
499 TRACE_EVENT1(tracing_category_, 494 TRACE_EVENT1(tracing_category_,
500 "TaskQueueThrottler::MaybeSchedulePumpThrottledTasks", 495 "TaskQueueThrottler::MaybeSchedulePumpThrottledTasks",
501 "delay_till_next_pump_ms", delay.InMilliseconds()); 496 "delay_till_next_pump_ms", delay.InMilliseconds());
502 task_runner_->PostDelayedTask( 497 task_runner_->PostDelayedTask(
503 from_here, pump_throttled_tasks_closure_.callback(), delay); 498 from_here, pump_throttled_tasks_closure_.callback(), delay);
504 } 499 }
505 500
506 TaskQueueThrottler::TimeBudgetPool* TaskQueueThrottler::CreateTimeBudgetPool( 501 TaskQueueThrottler::TimeBudgetPool* TaskQueueThrottler::CreateTimeBudgetPool(
507 const char* name) { 502 const char* name,
503 base::Optional<base::TimeDelta> max_budget_level,
504 base::Optional<base::TimeDelta> max_throttling_duration) {
508 TimeBudgetPool* time_budget_pool = 505 TimeBudgetPool* time_budget_pool =
509 new TimeBudgetPool(name, this, tick_clock_->NowTicks(), max_budget_level_, 506 new TimeBudgetPool(name, this, tick_clock_->NowTicks(), max_budget_level,
510 max_throttling_duration_); 507 max_throttling_duration);
511 time_budget_pools_[time_budget_pool] = base::WrapUnique(time_budget_pool); 508 time_budget_pools_[time_budget_pool] = base::WrapUnique(time_budget_pool);
512 return time_budget_pool; 509 return time_budget_pool;
513 } 510 }
514 511
515 void TaskQueueThrottler::OnTaskRunTimeReported(TaskQueue* task_queue, 512 void TaskQueueThrottler::OnTaskRunTimeReported(TaskQueue* task_queue,
516 base::TimeTicks start_time, 513 base::TimeTicks start_time,
517 base::TimeTicks end_time) { 514 base::TimeTicks end_time) {
518 if (!IsThrottled(task_queue)) 515 if (!IsThrottled(task_queue))
519 return; 516 return;
520 517
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
615 612
616 queue->SetQueueEnabled(false); 613 queue->SetQueueEnabled(false);
617 queue->SetTimeDomain(time_domain_.get()); 614 queue->SetTimeDomain(time_domain_.get());
618 MaybeSchedulePumpQueue(FROM_HERE, lazy_now.Now(), queue, 615 MaybeSchedulePumpQueue(FROM_HERE, lazy_now.Now(), queue,
619 GetNextAllowedRunTime(lazy_now.Now(), queue)); 616 GetNextAllowedRunTime(lazy_now.Now(), queue));
620 } 617 }
621 } 618 }
622 619
623 } // namespace scheduler 620 } // namespace scheduler
624 } // namespace blink 621 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698