Chromium Code Reviews| Index: content/renderer/render_thread_impl.cc |
| diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc |
| index 45678d19a939b0bec6864ddc6aca43a1d66fc21f..0ae8dc68ea4017a4a14ebc9af592bd060bba3532 100644 |
| --- a/content/renderer/render_thread_impl.cc |
| +++ b/content/renderer/render_thread_impl.cc |
| @@ -898,6 +898,13 @@ void RenderThreadImpl::Init( |
| base::Bind(&RenderThreadImpl::RecordPurgeAndSuspendMemoryGrowthMetrics, |
| base::Unretained(this))); |
| + purge_before_suspend_timers_closure_.Reset(base::Bind( |
| + &RenderThreadImpl::PurgeBeforeSuspendTimerQueueWhenBackgrounded, |
| + base::Unretained(this))); |
| + suspend_timers_when_backgrounded_closure_.Reset( |
| + base::Bind(&RenderThreadImpl::SuspendTimerQueueWhenBackgrounded, |
| + base::Unretained(this))); |
|
haraken
2017/02/03 04:30:49
Can we call this just before calling PostDelayedTa
tasak
2017/02/03 05:55:26
Done.
|
| + |
| base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this); |
| // If this renderer doesn't run inside the browser process, enable |
| @@ -1203,11 +1210,6 @@ void RenderThreadImpl::InitializeWebKit( |
| isolate->IsolateInBackgroundNotification(); |
| } |
| - renderer_scheduler_->SetTimerQueueSuspensionWhenBackgroundedEnabled( |
| - GetContentClient() |
| - ->renderer() |
| - ->AllowTimerSuspensionWhenProcessBackgrounded()); |
| - |
| SkGraphics::SetResourceCacheSingleAllocationByteLimit( |
| kImageCacheSingleAllocationByteLimit); |
| @@ -1641,8 +1643,29 @@ void RenderThreadImpl::OnProcessBackgrounded(bool backgrounded) { |
| if (backgrounded) { |
| renderer_scheduler_->OnRendererBackgrounded(); |
| + |
| + if (GetContentClient() |
| + ->renderer() |
| + ->AllowTimerSuspensionWhenProcessBackgrounded()) { |
| + base::TimeDelta suspend_timers_when_backgrounded_delay = |
| + base::TimeDelta::FromMilliseconds( |
| + kSuspendTimersWhenBackgroundedDelayMillis); |
| + GetRendererScheduler()->DefaultTaskRunner()->PostDelayedTask( |
| + FROM_HERE, purge_before_suspend_timers_closure_.callback(), |
| + suspend_timers_when_backgrounded_delay); |
| + } |
| } else { |
| renderer_scheduler_->OnRendererForegrounded(); |
| + |
| + purge_before_suspend_timers_closure_.Cancel(); |
| + purge_before_suspend_timers_closure_.Reset(base::Bind( |
| + &RenderThreadImpl::PurgeBeforeSuspendTimerQueueWhenBackgrounded, |
| + base::Unretained(this))); |
| + suspend_timers_when_backgrounded_closure_.Cancel(); |
| + suspend_timers_when_backgrounded_closure_.Reset( |
| + base::Bind(&RenderThreadImpl::SuspendTimerQueueWhenBackgrounded, |
| + base::Unretained(this))); |
|
haraken
2017/02/03 04:30:49
Ditto. Maybe can we Reset the closure just before
tasak
2017/02/03 05:55:26
Done.
|
| + |
| // TODO(tasak): after enabling MemoryCoordinator, remove this Notify |
| // and follow MemoryCoordinator's request. |
| if (base::FeatureList::IsEnabled(features::kPurgeAndSuspend)) |
| @@ -1660,6 +1683,32 @@ void RenderThreadImpl::OnProcessBackgrounded(bool backgrounded) { |
| } |
| } |
| +void RenderThreadImpl::PurgeBeforeSuspendTimerQueueWhenBackgrounded() { |
| + DCHECK(IsMainThread()); |
| + if (!RendererIsHidden()) |
| + return; |
| + // TODO(tasak): use purge method instead of notifying SUSPENDED |
| + // when MemoryCoordinator supports. |
| + base::MemoryCoordinatorClientRegistry::GetInstance()->Notify( |
| + base::MemoryState::SUSPENDED); |
| + |
| + // Since purging is not a synchronous task (e.g. v8 GC, oilpan GC, ...), |
| + // we need to wait until the task is finished. So wait 5 seconds and |
| + // update purge+suspend UMA histogram. |
| + // TODO(tasak): use MemoryCoordinator's callback to report purge+suspend |
| + // UMA when MemoryCoordinator is available. |
| + GetRendererScheduler()->DefaultTaskRunner()->PostDelayedTask( |
| + FROM_HERE, suspend_timers_when_backgrounded_closure_.callback(), |
| + base::TimeDelta::FromSeconds(5)); |
| +} |
| + |
| +void RenderThreadImpl::SuspendTimerQueueWhenBackgrounded() { |
| + DCHECK(IsMainThread()); |
| + if (!RendererIsHidden()) |
| + return; |
| + renderer_scheduler_->SuspendRenderer(); |
| +} |
| + |
| void RenderThreadImpl::OnProcessPurgeAndSuspend() { |
| ChildThreadImpl::OnProcessPurgeAndSuspend(); |
| if (!RendererIsHidden()) |