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

Unified Diff: content/renderer/render_thread_impl.cc

Issue 2668663002: Purge memory before suspending timer queues when backgrounded. (Closed)
Patch Set: Fixed. 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..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())
« no previous file with comments | « content/renderer/render_thread_impl.h ('k') | third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698