| 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 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |