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

Unified Diff: chrome/browser/memory/tab_manager.cc

Issue 2387603003: Resume a backgrounded renderer that was purged and suspended (Closed)
Patch Set: 2min / 1min. Created 4 years, 2 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
« no previous file with comments | « no previous file | content/browser/renderer_host/render_process_host_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/memory/tab_manager.cc
diff --git a/chrome/browser/memory/tab_manager.cc b/chrome/browser/memory/tab_manager.cc
index 582b2e667099f6fa0085f6721c4b9c69a37709c8..5e3ec556df6f58b9724e0006762c174b4d9be229 100644
--- a/chrome/browser/memory/tab_manager.cc
+++ b/chrome/browser/memory/tab_manager.cc
@@ -84,6 +84,14 @@ const int kRecentTabDiscardIntervalSeconds = 60;
// machine was suspended and correct the timing statistics.
const int kSuspendThresholdSeconds = kAdjustmentIntervalSeconds * 4;
+// If a backgrounded renderer is kept backgrounded during this time after
+// suspended, resume the renderer to avoid breaking web.
+const int kResumeSuspendedRendererMinutes = 2;
+
+// After resuming and running a backgrounded renderer for this period,
+// the renderer is purged and suspended again.
+const int kSuspendResumedRendererMinutes = 1;
haraken 2016/10/06 08:21:20 As discussed offline, 1 min => 10 sec?
tasak 2016/10/06 08:42:36 Done.
dcheng 2016/10/06 09:55:08 Nit: this can just be a constexpr base::TimeDelta.
tasak 2016/10/06 10:10:05 I see. Done. Thank you.
Avi (use Gerrit) 2016/10/18 06:15:36 dcheng: Are you sure that making a constexpr TimeD
+
// The time during which a tab is protected from discarding after it stops being
// audible.
const int kAudioProtectionTimeSeconds = 60;
@@ -683,8 +691,9 @@ void TabManager::PurgeAndSuspendBackgroundedTabs() {
}
if (purge_and_suspend_time <= 0)
return;
+ base::TimeTicks current_time = NowTicks();
auto purge_and_suspend_time_threshold =
- NowTicks() - base::TimeDelta::FromSeconds(purge_and_suspend_time);
+ current_time - base::TimeDelta::FromSeconds(purge_and_suspend_time);
auto tab_stats = GetUnsortedTabStats();
for (auto& tab : tab_stats) {
if (!tab.render_process_host->IsProcessBackgrounded())
@@ -695,7 +704,26 @@ void TabManager::PurgeAndSuspendBackgroundedTabs() {
// timers if we want necessary and sufficient signals.
if (tab.last_active > purge_and_suspend_time_threshold)
continue;
- tab.render_process_host->PurgeAndSuspend();
+
+ auto last_purged_and_suspended_time =
+ tab.render_process_host->GetLastPurgedAndSuspendedTime();
+ auto last_resumed_time =
+ tab.render_process_host->GetLastResumedInBackgroundTime();
+
+ if (last_purged_and_suspended_time < tab.last_active ||
+ (last_resumed_time > last_purged_and_suspended_time &&
+ last_purged_and_suspended_time > tab.last_active &&
+ ((current_time - last_resumed_time) >
+ base::TimeDelta::FromMinutes(kSuspendResumedRendererMinutes)))) {
+ tab.render_process_host->PurgeAndSuspend();
+ if (!task_runner_.get())
+ task_runner_ = base::ThreadTaskRunnerHandle::Get();
+ } else {
+ auto delta = current_time - last_purged_and_suspended_time;
+ if (last_resumed_time < last_purged_and_suspended_time &&
+ delta > base::TimeDelta::FromMinutes(kResumeSuspendedRendererMinutes))
+ tab.render_process_host->Resume();
+ }
}
}
« no previous file with comments | « no previous file | content/browser/renderer_host/render_process_host_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698