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..5f7e5ae4773bd265ddddeb2d49b8761ebcd52d38 100644 |
--- a/content/renderer/render_thread_impl.cc |
+++ b/content/renderer/render_thread_impl.cc |
@@ -898,6 +898,12 @@ void RenderThreadImpl::Init( |
base::Bind(&RenderThreadImpl::RecordPurgeAndSuspendMemoryGrowthMetrics, |
base::Unretained(this))); |
+ purge_before_suspend_timers_closure_.Reset(base::Bind( |
+ &RenderThreadImpl::PurgeBeforeSuspendTimerQueue, base::Unretained(this))); |
+ suspend_timers_when_backgrounded_closure_.Reset( |
+ base::Bind(&RenderThreadImpl::SuspendTimerQueueWhenBackgrounded, |
+ base::Unretained(this))); |
+ |
base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this); |
// If this renderer doesn't run inside the browser process, enable |
@@ -1203,11 +1209,6 @@ void RenderThreadImpl::InitializeWebKit( |
isolate->IsolateInBackgroundNotification(); |
} |
- renderer_scheduler_->SetTimerQueueSuspensionWhenBackgroundedEnabled( |
- GetContentClient() |
- ->renderer() |
- ->AllowTimerSuspensionWhenProcessBackgrounded()); |
- |
SkGraphics::SetResourceCacheSingleAllocationByteLimit( |
kImageCacheSingleAllocationByteLimit); |
@@ -1641,8 +1642,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::PurgeBeforeSuspendTimerQueue, |
+ base::Unretained(this))); |
+ suspend_timers_when_backgrounded_closure_.Cancel(); |
+ suspend_timers_when_backgrounded_closure_.Reset( |
+ base::Bind(&RenderThreadImpl::SuspendTimerQueueWhenBackgrounded, |
+ base::Unretained(this))); |
+ |
// TODO(tasak): after enabling MemoryCoordinator, remove this Notify |
// and follow MemoryCoordinator's request. |
if (base::FeatureList::IsEnabled(features::kPurgeAndSuspend)) |
@@ -1660,6 +1682,24 @@ void RenderThreadImpl::OnProcessBackgrounded(bool backgrounded) { |
} |
} |
+void RenderThreadImpl::PurgeBeforeSuspendTimerQueue() { |
haraken
2017/02/02 08:53:12
PurgeBeforeSuspendTimerQueue => PurgeAndSuspendTim
tasak
2017/02/03 03:13:14
Done.
|
+ DCHECK(IsMainThread()); |
+ if (!RendererIsHidden()) |
+ return; |
+ base::MemoryCoordinatorClientRegistry::GetInstance()->Notify( |
+ base::MemoryState::SUSPENDED); |
haraken
2017/02/02 08:53:13
You don't need to do this in this CL but we want t
tasak
2017/02/03 03:13:14
Acknowledged.
|
+ GetRendererScheduler()->DefaultTaskRunner()->PostDelayedTask( |
+ FROM_HERE, suspend_timers_when_backgrounded_closure_.callback(), |
+ base::TimeDelta::FromSeconds(5)); |
haraken
2017/02/02 08:53:13
Add a comment and mention why this delay is needed
tasak
2017/02/03 03:13:14
Done.
|
+} |
+ |
+void RenderThreadImpl::SuspendTimerQueueWhenBackgrounded() { |
+ DCHECK(IsMainThread()); |
+ if (!RendererIsHidden()) |
+ return; |
+ renderer_scheduler_->SuspendRenderer(); |
+} |
+ |
void RenderThreadImpl::OnProcessPurgeAndSuspend() { |
ChildThreadImpl::OnProcessPurgeAndSuspend(); |
if (!RendererIsHidden()) |