Chromium Code Reviews| Index: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
| diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
| index 5f5473e063b6fb024c50bfca4320a751adce8db6..b9553cbe0bef34ae19dfb167bd3c845198b74f99 100644 |
| --- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
| +++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
| @@ -37,6 +37,8 @@ const double kShortIdlePeriodDurationPercentile = 50; |
| // Amount of idle time left in a frame (as a ratio of the vsync interval) above |
| // which main thread compositing can be considered fast. |
| const double kFastCompositingIdleTimeThreshold = .2; |
| +// We do not throttle anything while audio is played and shortly after that. |
| +const int kThrottlingDelayAfterAudioIsPlayedInSeconds = 5; |
| void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) { |
| int load_percentage = static_cast<int>(load * 100); |
| @@ -157,6 +159,18 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( |
| foreground_main_thread_load_tracker( |
| now, |
| base::Bind(&ReportForegroundRendererTaskLoad)), |
| + audio_playback_switch( |
| + renderer_scheduler_impl->ControlTaskRunner().get(), |
| + base::TimeDelta::FromSeconds( |
| + kThrottlingDelayAfterAudioIsPlayedInSeconds), |
| + base::Bind(&RendererSchedulerImpl::OnAudioStartedImpl, |
| + // We can't get weak pointer to renderer_scheduler here |
| + // but this callback is guaranteed to be called while |
| + // |audio_playback_switch| is alive, which guarantees that |
| + // renderer_scheduler is still alive. |
| + base::Unretained(renderer_scheduler_impl)), |
|
Sami
2016/09/29 13:36:07
Could we instead change things so that we can get
altimin
2016/09/29 16:29:43
Note: per Chromium style guide weak pointer factor
|
| + base::Bind(&RendererSchedulerImpl::OnAudioStoppedImpl, |
| + base::Unretained(renderer_scheduler_impl))), |
| current_use_case(UseCase::NONE), |
| timer_queue_suspend_count(0), |
| navigation_task_expected_count(0), |
| @@ -476,6 +490,14 @@ void RendererSchedulerImpl::OnRendererForegrounded() { |
| ResumeTimerQueueWhenForegrounded(); |
| } |
| +void RendererSchedulerImpl::OnAudioStarted() { |
| + MainThreadOnly().audio_playback_switch.Enable(); |
|
Sami
2016/09/29 13:36:07
These could use trace events I think.
|
| +} |
| + |
| +void RendererSchedulerImpl::OnAudioStopped() { |
| + MainThreadOnly().audio_playback_switch.Disable(); |
| +} |
| + |
| void RendererSchedulerImpl::SuspendRenderer() { |
| helper_.CheckOnValidThread(); |
| DCHECK(MainThreadOnly().renderer_backgrounded); |
| @@ -1195,6 +1217,14 @@ void RendererSchedulerImpl::CreateTraceEventObjectSnapshotLocked() const { |
| this, AsValueLocked(helper_.scheduler_tqm_delegate()->NowTicks())); |
| } |
| +void RendererSchedulerImpl::OnAudioStartedImpl() { |
|
alex clarke (OOO till 29th)
2016/09/29 11:16:53
I don't think we need these two functions, why not
altimin
2016/09/29 16:29:43
Done.
|
| + task_queue_throttler()->SetIsAudioActive(true); |
| +} |
| + |
| +void RendererSchedulerImpl::OnAudioStoppedImpl() { |
| + task_queue_throttler()->SetIsAudioActive(false); |
| +} |
| + |
| // static |
| const char* RendererSchedulerImpl::ExpensiveTaskPolicyToString( |
| ExpensiveTaskPolicy expensive_task_policy) { |