Index: content/browser/renderer_host/render_process_host_impl.cc |
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc |
index ff4f9869881ce4d4e3e62a73e012b588fa821d65..d9722724f76df15480940105f50991e9785e8590 100644 |
--- a/content/browser/renderer_host/render_process_host_impl.cc |
+++ b/content/browser/renderer_host/render_process_host_impl.cc |
@@ -495,7 +495,7 @@ RenderProcessHostImpl::RenderProcessHostImpl( |
pending_views_(0), |
mojo_application_host_(new MojoApplicationHost), |
visible_widgets_(0), |
- backgrounded_(true), |
+ is_process_backgrounded_(false), |
is_initialized_(false), |
id_(ChildProcessHostImpl::GenerateChildProcessUniqueId()), |
browser_context_(browser_context), |
@@ -533,11 +533,6 @@ RenderProcessHostImpl::RenderProcessHostImpl( |
subscribe_uniform_enabled_ = |
base::CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kEnableSubscribeUniformExtension); |
- |
- // Note: When we create the RenderProcessHostImpl, it's technically |
- // backgrounded, because it has no visible listeners. But the process |
- // doesn't actually exist yet, so we'll Background it later, after |
- // creation. |
} |
// static |
@@ -1089,23 +1084,20 @@ void RenderProcessHostImpl::ShutdownForBadMessage() { |
} |
void RenderProcessHostImpl::WidgetRestored() { |
- // Verify we were properly backgrounded. |
- DCHECK_EQ(backgrounded_, (visible_widgets_ == 0)); |
visible_widgets_++; |
- SetBackgrounded(false); |
+ UpdateProcessPriority(); |
+ DCHECK(!is_process_backgrounded_); |
} |
void RenderProcessHostImpl::WidgetHidden() { |
- // On startup, the browser will call Hide |
- if (backgrounded_) |
+ // On startup, the browser will call Hide. We ignore this call. |
+ if (visible_widgets_ == 0) |
return; |
- DCHECK_EQ(backgrounded_, (visible_widgets_ == 0)); |
- visible_widgets_--; |
- DCHECK_GE(visible_widgets_, 0); |
+ --visible_widgets_; |
if (visible_widgets_ == 0) { |
- DCHECK(!backgrounded_); |
- SetBackgrounded(true); |
+ DCHECK(!is_process_backgrounded_); |
+ UpdateProcessPriority(); |
} |
} |
@@ -1113,6 +1105,10 @@ int RenderProcessHostImpl::VisibleWidgetCount() const { |
return visible_widgets_; |
} |
+void RenderProcessHostImpl::AudioStateChanged() { |
+ UpdateProcessPriority(); |
+} |
+ |
bool RenderProcessHostImpl::IsForGuestsOnly() const { |
return is_for_guests_only_; |
} |
@@ -2135,6 +2131,8 @@ void RenderProcessHostImpl::ProcessDied(bool already_dead, |
delete queued_messages_.front(); |
queued_messages_.pop(); |
} |
+ UpdateProcessPriority(); |
+ DCHECK(!is_process_backgrounded_); |
within_process_died_observer_ = true; |
NotificationService::current()->Notify( |
@@ -2252,25 +2250,28 @@ void RenderProcessHostImpl::SuddenTerminationChanged(bool enabled) { |
SetSuddenTerminationAllowed(enabled); |
} |
-void RenderProcessHostImpl::SetBackgrounded(bool backgrounded) { |
- TRACE_EVENT1("renderer_host", "RenderProcessHostImpl::SetBackgrounded", |
- "backgrounded", backgrounded); |
- // Note: we always set the backgrounded_ value. If the process is NULL |
- // (and hence hasn't been created yet), we will set the process priority |
- // later when we create the process. |
- backgrounded_ = backgrounded; |
- if (!child_process_launcher_.get() || child_process_launcher_->IsStarting()) |
+void RenderProcessHostImpl::UpdateProcessPriority() { |
+ if (!child_process_launcher_.get() || child_process_launcher_->IsStarting()) { |
+ is_process_backgrounded_ = false; |
return; |
+ } |
- // Don't background processes which have active audio streams. |
- if (backgrounded_ && audio_renderer_host_->HasActiveAudio()) |
- return; |
+ // We background a process as soon as it hosts no active audio streams and no |
+ // visible widgets -- the callers must call this function whenever we |
+ // transition in/out of thoses states. Processes are initially launched with |
Avi (use Gerrit)
2015/08/19 00:30:29
"those states"
sebsg
2015/08/19 15:22:21
Done.
|
+ // foreground priority, so when the process doesn't exist. |
Avi (use Gerrit)
2015/08/19 00:30:29
"so when the process doesn't exist..." what? Compl
sebsg
2015/08/19 15:22:21
Thanks for noticing that, the comment was made whe
|
+ const bool should_background = |
+ visible_widgets_ == 0 && !audio_renderer_host_->HasActiveAudio() && |
+ !base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kDisableRendererBackgrounding); |
- const base::CommandLine* command_line = |
- base::CommandLine::ForCurrentProcess(); |
- if (command_line->HasSwitch(switches::kDisableRendererBackgrounding)) |
+ if (is_process_backgrounded_ == should_background) |
return; |
+ TRACE_EVENT1("renderer_host", "RenderProcessHostImpl::UpdateProcessPriority", |
+ "should_background", should_background); |
+ is_process_backgrounded_ = should_background; |
+ |
#if defined(OS_WIN) |
// The cbstext.dll loads as a global GetMessage hook in the browser process |
// and intercepts/unintercepts the kernel32 API SetPriorityClass in a |
@@ -2290,7 +2291,7 @@ void RenderProcessHostImpl::SetBackgrounded(bool backgrounded) { |
base::FieldTrialList::Find("BackgroundRendererProcesses"); |
if (!trial || !base::StartsWith(trial->group_name(), "Disallow", |
base::CompareCase::SENSITIVE)) { |
- child_process_launcher_->SetProcessBackgrounded(backgrounded); |
+ child_process_launcher_->SetProcessBackgrounded(should_background); |
} |
#else |
// Control the background state from the browser process, otherwise the task |
@@ -2298,11 +2299,11 @@ void RenderProcessHostImpl::SetBackgrounded(bool backgrounded) { |
// tasks executing at lowered priority ahead of it or simply by not being |
// swiftly scheduled by the OS per the low process priority |
// (http://crbug.com/398103). |
- child_process_launcher_->SetProcessBackgrounded(backgrounded); |
+ child_process_launcher_->SetProcessBackgrounded(should_background); |
#endif // OS_WIN |
// Notify the child process of background state. |
- Send(new ChildProcessMsg_SetProcessBackgrounded(backgrounded)); |
+ Send(new ChildProcessMsg_SetProcessBackgrounded(should_background)); |
} |
void RenderProcessHostImpl::OnProcessLaunched() { |
@@ -2325,7 +2326,8 @@ void RenderProcessHostImpl::OnProcessLaunched() { |
FROM_HERE_WITH_EXPLICIT_FUNCTION( |
"465841 RenderProcessHostImpl::OnProcessLaunched::Backgrounded")); |
DCHECK(child_process_launcher_->GetProcess().IsValid()); |
- SetBackgrounded(backgrounded_); |
+ DCHECK(!is_process_backgrounded_); |
+ UpdateProcessPriority(); |
} |
// TODO(erikchen): Remove ScopedTracker below once http://crbug.com/465841 |