| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |