Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(232)

Unified Diff: content/renderer/render_thread_impl.cc

Issue 2668663002: Purge memory before suspending timer queues when backgrounded. (Closed)
Patch Set: Remove mainThreadOnly's timer_queue_suspended_when_backgrounded Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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())

Powered by Google App Engine
This is Rietveld 408576698