summaryrefslogtreecommitdiffstats
path: root/content/browser/child_process_launcher.cc
diff options
context:
space:
mode:
authorrvargas <rvargas@chromium.org>2014-10-17 15:32:16 -0700
committerCommit bot <commit-bot@chromium.org>2014-10-17 22:32:40 +0000
commit079d184e2786686546385df92c7e72d8023f2941 (patch)
tree9ecf11940254e298ad70b8e9a1b18adb7709285b /content/browser/child_process_launcher.cc
parent09593fede3cf4ce740d55551cbbf8bd726a6fbd2 (diff)
downloadchromium_src-079d184e2786686546385df92c7e72d8023f2941.zip
chromium_src-079d184e2786686546385df92c7e72d8023f2941.tar.gz
chromium_src-079d184e2786686546385df92c7e72d8023f2941.tar.bz2
Enforce handle ownership in base::Process.
The main user (and the immediate reason for the change) is to improve handle ownership in content::ChildProcessLauncher. This CL is not enforcing clean ownership beyond ChildProcessLauncher; that is to be covered by subsequent CLs. BUG=417532 TEST=base_unittests R=scottmg@chromium.org, thestig@chromium.org Review URL: https://codereview.chromium.org/651253002 Cr-Commit-Position: refs/heads/master@{#300180}
Diffstat (limited to 'content/browser/child_process_launcher.cc')
-rw-r--r--content/browser/child_process_launcher.cc103
1 files changed, 54 insertions, 49 deletions
diff --git a/content/browser/child_process_launcher.cc b/content/browser/child_process_launcher.cc
index b957397..2d3a1ae 100644
--- a/content/browser/child_process_launcher.cc
+++ b/content/browser/child_process_launcher.cc
@@ -75,11 +75,10 @@ class ChildProcessLauncher::Context
{
}
- void Launch(
- SandboxedProcessLauncherDelegate* delegate,
- base::CommandLine* cmd_line,
- int child_process_id,
- Client* client) {
+ void Launch(SandboxedProcessLauncherDelegate* delegate,
+ base::CommandLine* cmd_line,
+ int child_process_id,
+ Client* client) {
client_ = client;
CHECK(BrowserThread::GetCurrentThreadIdentifier(&client_thread_id_));
@@ -92,13 +91,12 @@ class ChildProcessLauncher::Context
#endif
BrowserThread::PostTask(
BrowserThread::PROCESS_LAUNCHER, FROM_HERE,
- base::Bind(
- &Context::LaunchInternal,
- make_scoped_refptr(this),
- client_thread_id_,
- child_process_id,
- delegate,
- cmd_line));
+ base::Bind(&Context::LaunchInternal,
+ make_scoped_refptr(this),
+ client_thread_id_,
+ child_process_id,
+ delegate,
+ cmd_line));
}
#if defined(OS_ANDROID)
@@ -112,14 +110,14 @@ class ChildProcessLauncher::Context
if (BrowserThread::CurrentlyOn(client_thread_id)) {
// This is always invoked on the UI thread which is commonly the
// |client_thread_id| so we can shortcut one PostTask.
- this_object->Notify(handle);
+ this_object->Notify(base::Process(handle));
} else {
BrowserThread::PostTask(
client_thread_id, FROM_HERE,
base::Bind(
&ChildProcessLauncher::Context::Notify,
this_object,
- handle));
+ base::Passed(base::Process(handle))));
}
}
#endif
@@ -135,6 +133,19 @@ class ChildProcessLauncher::Context
terminate_child_on_shutdown_ = terminate_on_shutdown;
}
+ void GetTerminationStatus() {
+ termination_status_ =
+ base::GetTerminationStatus(process_.Handle(), &exit_code_);
+ }
+
+ void SetProcessBackgrounded(bool background) {
+ base::Process to_pass = process_.Duplicate();
+ BrowserThread::PostTask(
+ BrowserThread::PROCESS_LAUNCHER, FROM_HERE,
+ base::Bind(&Context::SetProcessBackgroundedInternal,
+ base::Passed(&to_pass), background));
+ }
+
private:
friend class base::RefCountedThreadSafe<ChildProcessLauncher::Context>;
friend class ChildProcessLauncher;
@@ -323,7 +334,7 @@ class ChildProcessLauncher::Context
#if defined(OS_POSIX) && !defined(OS_MACOSX)
use_zygote,
#endif
- handle));
+ base::Passed(base::Process(handle))));
#endif // !defined(OS_ANDROID)
}
@@ -331,21 +342,21 @@ class ChildProcessLauncher::Context
#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
bool zygote,
#endif
- base::ProcessHandle handle) {
+ base::Process process) {
#if defined(OS_ANDROID)
// Finally close the ipcfd
base::ScopedFD ipcfd_closer(ipcfd_);
#endif
starting_ = false;
- process_.set_handle(handle);
- if (!handle)
+ process_ = process.Pass();
+ if (!process_.IsValid())
LOG(ERROR) << "Failed to launch child process";
#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
zygote_ = zygote;
#endif
if (client_) {
- if (handle) {
+ if (process_.IsValid()) {
client_->OnProcessLaunched();
} else {
client_->OnProcessLaunchFailed();
@@ -356,7 +367,7 @@ class ChildProcessLauncher::Context
}
void Terminate() {
- if (!process_.handle())
+ if (!process_.IsValid())
return;
if (!terminate_child_on_shutdown_)
@@ -371,16 +382,14 @@ class ChildProcessLauncher::Context
#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
zygote_,
#endif
- process_.handle()));
- process_.set_handle(base::kNullProcessHandle);
+ base::Passed(&process_)));
}
- static void SetProcessBackgrounded(base::ProcessHandle handle,
- bool background) {
- base::Process process(handle);
+ static void SetProcessBackgroundedInternal(base::Process process,
+ bool background) {
process.SetProcessBackgrounded(background);
#if defined(OS_ANDROID)
- SetChildProcessInForeground(handle, !background);
+ SetChildProcessInForeground(process.Handle(), !background);
#endif
}
@@ -388,12 +397,12 @@ class ChildProcessLauncher::Context
#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
bool zygote,
#endif
- base::ProcessHandle handle) {
+ base::Process process) {
#if defined(OS_ANDROID)
- VLOG(0) << "ChromeProcess: Stopping process with handle " << handle;
- StopChildProcess(handle);
+ VLOG(1) << "ChromeProcess: Stopping process with handle "
+ << process.Handle();
+ StopChildProcess(process.Handle());
#else
- base::Process process(handle);
// Client has gone away, so just kill the process. Using exit code 0
// means that UMA won't treat this as a crash.
process.Terminate(RESULT_CODE_NORMAL_EXIT);
@@ -403,14 +412,13 @@ class ChildProcessLauncher::Context
if (zygote) {
// If the renderer was created via a zygote, we have to proxy the reaping
// through the zygote process.
- ZygoteHostImpl::GetInstance()->EnsureProcessTerminated(handle);
+ ZygoteHostImpl::GetInstance()->EnsureProcessTerminated(process.Handle());
} else
#endif // !OS_MACOSX
{
- base::EnsureProcessTerminated(handle);
+ base::EnsureProcessTerminated(process.Handle());
}
#endif // OS_POSIX
- process.Close();
#endif // defined(OS_ANDROID)
}
@@ -453,16 +461,15 @@ bool ChildProcessLauncher::IsStarting() {
return context_->starting_;
}
-base::ProcessHandle ChildProcessLauncher::GetHandle() {
+const base::Process& ChildProcessLauncher::GetProcess() const {
DCHECK(!context_->starting_);
- return context_->process_.handle();
+ return context_->process_;
}
base::TerminationStatus ChildProcessLauncher::GetChildTerminationStatus(
bool known_dead,
int* exit_code) {
- base::ProcessHandle handle = context_->process_.handle();
- if (handle == base::kNullProcessHandle) {
+ if (!context_->process_.IsValid()) {
// Process is already gone, so return the cached termination status.
if (exit_code)
*exit_code = context_->exit_code_;
@@ -471,25 +478,27 @@ base::TerminationStatus ChildProcessLauncher::GetChildTerminationStatus(
#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
if (context_->zygote_) {
context_->termination_status_ = ZygoteHostImpl::GetInstance()->
- GetTerminationStatus(handle, known_dead, &context_->exit_code_);
+ GetTerminationStatus(context_->process_.Handle(), known_dead,
+ &context_->exit_code_);
} else if (known_dead) {
context_->termination_status_ =
- base::GetKnownDeadTerminationStatus(handle, &context_->exit_code_);
+ base::GetKnownDeadTerminationStatus(context_->process_.Handle(),
+ &context_->exit_code_);
} else {
#elif defined(OS_MACOSX)
if (known_dead) {
context_->termination_status_ =
- base::GetKnownDeadTerminationStatus(handle, &context_->exit_code_);
+ base::GetKnownDeadTerminationStatus(context_->process_.Handle(),
+ &context_->exit_code_);
} else {
#elif defined(OS_ANDROID)
- if (IsChildProcessOomProtected(handle)) {
- context_->termination_status_ = base::TERMINATION_STATUS_OOM_PROTECTED;
+ if (IsChildProcessOomProtected(context_->process_.Handle())) {
+ context_->termination_status_ = base::TERMINATION_STATUS_OOM_PROTECTED;
} else {
#else
{
#endif
- context_->termination_status_ =
- base::GetTerminationStatus(handle, &context_->exit_code_);
+ context_->GetTerminationStatus();
}
if (exit_code)
@@ -508,11 +517,7 @@ base::TerminationStatus ChildProcessLauncher::GetChildTerminationStatus(
}
void ChildProcessLauncher::SetProcessBackgrounded(bool background) {
- BrowserThread::PostTask(
- BrowserThread::PROCESS_LAUNCHER, FROM_HERE,
- base::Bind(
- &ChildProcessLauncher::Context::SetProcessBackgrounded,
- GetHandle(), background));
+ context_->process_.SetProcessBackgrounded(background);
}
void ChildProcessLauncher::SetTerminateChildOnShutdown(