Index: content/browser/child_process_launcher.cc |
diff --git a/content/browser/child_process_launcher.cc b/content/browser/child_process_launcher.cc |
index b9573974eca8e38629b7c5c5a3eb23a1ee45fa2e..2d3a1ae693f4d0a470d8254f088dd2303a3e72f5 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( |