Chromium Code Reviews| Index: content/browser/child_process_launcher.cc |
| diff --git a/content/browser/child_process_launcher.cc b/content/browser/child_process_launcher.cc |
| index 721cd5a88ede6cc6eeb7907bdecbfd35b7a5ff6d..22aa71106ef73e550e3cf3e6b9283537ad0fc1d4 100644 |
| --- a/content/browser/child_process_launcher.cc |
| +++ b/content/browser/child_process_launcher.cc |
| @@ -32,6 +32,7 @@ |
| #include "base/android/jni_android.h" |
| #include "content/browser/android/child_process_launcher_android.h" |
| #elif defined(OS_POSIX) |
| +#include "base/memory/shared_memory.h" |
| #include "base/memory/singleton.h" |
| #include "content/browser/renderer_host/render_sandbox_host_linux.h" |
| #include "content/browser/zygote_host/zygote_host_impl_linux.h" |
| @@ -39,6 +40,7 @@ |
| #endif |
| #if defined(OS_POSIX) |
| +#include "base/metrics/stats_table.h" |
| #include "base/posix/global_descriptors.h" |
| #endif |
| @@ -71,6 +73,7 @@ class ChildProcessLauncher::Context |
| void Launch( |
| #if defined(OS_WIN) |
| SandboxedProcessLauncherDelegate* delegate, |
| + bool launch_elevated, |
| #elif defined(OS_ANDROID) |
| int ipcfd, |
| #elif defined(OS_POSIX) |
| @@ -100,6 +103,7 @@ class ChildProcessLauncher::Context |
| child_process_id, |
| #if defined(OS_WIN) |
| delegate, |
| + launch_elevated, |
| #elif defined(OS_ANDROID) |
| ipcfd, |
| #elif defined(OS_POSIX) |
| @@ -107,6 +111,7 @@ class ChildProcessLauncher::Context |
| environ, |
| ipcfd, |
| #endif |
| + |
|
jam
2014/01/30 21:41:03
nit: drop the empty line
Drew Haven
2014/01/31 20:00:12
Done.
|
| cmd_line)); |
| } |
| @@ -183,6 +188,7 @@ class ChildProcessLauncher::Context |
| int child_process_id, |
| #if defined(OS_WIN) |
| SandboxedProcessLauncherDelegate* delegate, |
| + bool launch_elevated, |
| #elif defined(OS_ANDROID) |
| int ipcfd, |
| #elif defined(OS_POSIX) |
| @@ -195,19 +201,36 @@ class ChildProcessLauncher::Context |
| base::TimeTicks begin_launch_time = base::TimeTicks::Now(); |
| #if defined(OS_WIN) |
| - scoped_ptr<SandboxedProcessLauncherDelegate> delegate_deleter(delegate); |
| - base::ProcessHandle handle = StartSandboxedProcess(delegate, cmd_line); |
| -#elif defined(OS_ANDROID) |
| - // Android WebView runs in single process, ensure that we never get here |
| - // when running in single process mode. |
| - CHECK(!cmd_line->HasSwitch(switches::kSingleProcess)); |
| - |
| + base::ProcessHandle handle = base::kNullProcessHandle; |
| + if (launch_elevated) { |
| + base::LaunchOptions options; |
| + options.start_hidden = true; |
| + base::LaunchElevatedProcess(*cmd_line, options, &handle); |
| + } else { |
| + scoped_ptr<SandboxedProcessLauncherDelegate> delegate_deleter(delegate); |
| + handle = StartSandboxedProcess(delegate, cmd_line); |
| + } |
| +#elif defined(OS_POSIX) |
| std::string process_type = |
| cmd_line->GetSwitchValueASCII(switches::kProcessType); |
| std::vector<FileDescriptorInfo> files_to_register; |
| files_to_register.push_back( |
| FileDescriptorInfo(kPrimaryIPCChannel, |
| - base::FileDescriptor(ipcfd, false))); |
| + base::FileDescriptor(ipcfd, false))); |
| + base::StatsTable* stats_table = base::StatsTable::current(); |
|
jam
2014/01/30 21:41:03
this, and some of the other changes in this file a
Drew Haven
2014/01/31 20:00:12
Done.
|
| + if (stats_table && |
| + base::SharedMemory::IsHandleValid( |
| + stats_table->GetSharedMemoryHandle())) { |
| + files_to_register.push_back( |
| + FileDescriptorInfo(kStatsTableSharedMemFd, |
| + stats_table->GetSharedMemoryHandle())); |
| + } |
| +#endif |
| + |
| +#if defined(OS_ANDROID) |
| + // Android WebView runs in single process, ensure that we never get here |
| + // when running in single process mode. |
| + CHECK(!cmd_line->HasSwitch(switches::kSingleProcess)); |
| GetContentClient()->browser()-> |
| GetAdditionalMappedFilesForChildProcess(*cmd_line, child_process_id, |
| @@ -223,13 +246,6 @@ class ChildProcessLauncher::Context |
| // child termination. |
| file_util::ScopedFD ipcfd_closer(&ipcfd); |
| - std::string process_type = |
| - cmd_line->GetSwitchValueASCII(switches::kProcessType); |
| - std::vector<FileDescriptorInfo> files_to_register; |
| - files_to_register.push_back( |
| - FileDescriptorInfo(kPrimaryIPCChannel, |
| - base::FileDescriptor(ipcfd, false))); |
| - |
| #if !defined(OS_MACOSX) |
| GetContentClient()->browser()-> |
| GetAdditionalMappedFilesForChildProcess(*cmd_line, child_process_id, |
| @@ -330,7 +346,11 @@ class ChildProcessLauncher::Context |
| zygote_ = zygote; |
| #endif |
| if (client_) { |
| - client_->OnProcessLaunched(); |
| + if (handle) { |
| + client_->OnProcessLaunched(); |
| + } else { |
| + client_->OnProcessLaunchFailed(); |
| + } |
| } else { |
| Terminate(); |
| } |
| @@ -368,7 +388,7 @@ class ChildProcessLauncher::Context |
| #endif |
| base::ProcessHandle handle) { |
| #if defined(OS_ANDROID) |
| - LOG(INFO) << "ChromeProcess: Stopping process with handle " << handle; |
| + VLOG(0) << "ChromeProcess: Stopping process with handle " << handle; |
| StopChildProcess(handle); |
| #else |
| base::Process process(handle); |
| @@ -413,6 +433,7 @@ class ChildProcessLauncher::Context |
| ChildProcessLauncher::ChildProcessLauncher( |
| #if defined(OS_WIN) |
| SandboxedProcessLauncherDelegate* delegate, |
| + bool launch_elevated, |
| #elif defined(OS_POSIX) |
| bool use_zygote, |
| const base::EnvironmentMap& environ, |
| @@ -425,6 +446,7 @@ ChildProcessLauncher::ChildProcessLauncher( |
| context_->Launch( |
| #if defined(OS_WIN) |
| delegate, |
| + launch_elevated, |
| #elif defined(OS_ANDROID) |
| ipcfd, |
| #elif defined(OS_POSIX) |
| @@ -464,14 +486,22 @@ base::TerminationStatus ChildProcessLauncher::GetChildTerminationStatus( |
| if (context_->zygote_) { |
| context_->termination_status_ = ZygoteHostImpl::GetInstance()-> |
| GetTerminationStatus(handle, known_dead, &context_->exit_code_); |
| - } else |
| + } else if (known_dead) { |
| + context_->termination_status_ = |
| + base::GetKnownDeadTerminationStatus(handle, &context_->exit_code_); |
| + } else { |
| #elif defined(OS_MACOSX) |
| if (known_dead) { |
| context_->termination_status_ = |
| base::GetKnownDeadTerminationStatus(handle, &context_->exit_code_); |
| - } else |
| -#endif |
| + } else { |
| +#elif defined(OS_ANDROID) |
| + if (IsChildProcessOomProtected(handle)) { |
| + context_->termination_status_ = base::TERMINATION_STATUS_OOM_PROTECTED; |
| + } else { |
| +#else |
| { |
| +#endif |
| context_->termination_status_ = |
| base::GetTerminationStatus(handle, &context_->exit_code_); |
| } |