| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/child_process_launcher.h" | 5 #include "content/browser/child_process_launcher.h" |
| 6 | 6 |
| 7 #include <utility> // For std::pair. | 7 #include <utility> // For std::pair. |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 61 #endif | 61 #endif |
| 62 { | 62 { |
| 63 #if defined(OS_POSIX) | 63 #if defined(OS_POSIX) |
| 64 terminate_child_on_shutdown_ = !CommandLine::ForCurrentProcess()-> | 64 terminate_child_on_shutdown_ = !CommandLine::ForCurrentProcess()-> |
| 65 HasSwitch(switches::kChildCleanExit); | 65 HasSwitch(switches::kChildCleanExit); |
| 66 #else | 66 #else |
| 67 terminate_child_on_shutdown_ = true; | 67 terminate_child_on_shutdown_ = true; |
| 68 #endif | 68 #endif |
| 69 } | 69 } |
| 70 | 70 |
| 71 #if defined(OS_WIN) |
| 72 void Launch( |
| 73 SandboxedProcessLauncherDelegate* delegate, |
| 74 CommandLine* cmd_line, |
| 75 int child_process_id, |
| 76 Client* client) { |
| 77 Launch(delegate, false, cmd_line, child_process_id, client); |
| 78 } |
| 79 #endif |
| 80 |
| 71 void Launch( | 81 void Launch( |
| 72 #if defined(OS_WIN) | 82 #if defined(OS_WIN) |
| 73 SandboxedProcessLauncherDelegate* delegate, | 83 SandboxedProcessLauncherDelegate* delegate, |
| 84 bool run_elevated, |
| 74 #elif defined(OS_ANDROID) | 85 #elif defined(OS_ANDROID) |
| 75 int ipcfd, | 86 int ipcfd, |
| 76 #elif defined(OS_POSIX) | 87 #elif defined(OS_POSIX) |
| 77 bool use_zygote, | 88 bool use_zygote, |
| 78 const base::EnvironmentMap& environ, | 89 const base::EnvironmentMap& environ, |
| 79 int ipcfd, | 90 int ipcfd, |
| 80 #endif | 91 #endif |
| 81 CommandLine* cmd_line, | 92 CommandLine* cmd_line, |
| 82 int child_process_id, | 93 int child_process_id, |
| 83 Client* client) { | 94 Client* client) { |
| 84 client_ = client; | 95 client_ = client; |
| 85 | 96 |
| 86 CHECK(BrowserThread::GetCurrentThreadIdentifier(&client_thread_id_)); | 97 CHECK(BrowserThread::GetCurrentThreadIdentifier(&client_thread_id_)); |
| 87 | 98 |
| 88 #if defined(OS_ANDROID) | 99 #if defined(OS_ANDROID) |
| 89 // We need to close the client end of the IPC channel to reliably detect | 100 // We need to close the client end of the IPC channel to reliably detect |
| 90 // child termination. We will close this fd after we create the child | 101 // child termination. We will close this fd after we create the child |
| 91 // process which is asynchronous on Android. | 102 // process which is asynchronous on Android. |
| 92 ipcfd_ = ipcfd; | 103 ipcfd_ = ipcfd; |
| 93 #endif | 104 #endif |
| 94 BrowserThread::PostTask( | 105 BrowserThread::PostTask( |
| 95 BrowserThread::PROCESS_LAUNCHER, FROM_HERE, | 106 BrowserThread::PROCESS_LAUNCHER, FROM_HERE, |
| 96 base::Bind( | 107 base::Bind( |
| 97 &Context::LaunchInternal, | 108 &Context::LaunchInternal, |
| 98 make_scoped_refptr(this), | 109 make_scoped_refptr(this), |
| 99 client_thread_id_, | 110 client_thread_id_, |
| 100 child_process_id, | 111 child_process_id, |
| 101 #if defined(OS_WIN) | 112 #if defined(OS_WIN) |
| 102 delegate, | 113 delegate, |
| 114 run_elevated, |
| 103 #elif defined(OS_ANDROID) | 115 #elif defined(OS_ANDROID) |
| 104 ipcfd, | 116 ipcfd, |
| 105 #elif defined(OS_POSIX) | 117 #elif defined(OS_POSIX) |
| 106 use_zygote, | 118 use_zygote, |
| 107 environ, | 119 environ, |
| 108 ipcfd, | 120 ipcfd, |
| 109 #endif | 121 #endif |
| 110 cmd_line)); | 122 cmd_line)); |
| 111 } | 123 } |
| 112 | 124 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 } | 188 } |
| 177 } | 189 } |
| 178 | 190 |
| 179 static void LaunchInternal( | 191 static void LaunchInternal( |
| 180 // |this_object| is NOT thread safe. Only use it to post a task back. | 192 // |this_object| is NOT thread safe. Only use it to post a task back. |
| 181 scoped_refptr<Context> this_object, | 193 scoped_refptr<Context> this_object, |
| 182 BrowserThread::ID client_thread_id, | 194 BrowserThread::ID client_thread_id, |
| 183 int child_process_id, | 195 int child_process_id, |
| 184 #if defined(OS_WIN) | 196 #if defined(OS_WIN) |
| 185 SandboxedProcessLauncherDelegate* delegate, | 197 SandboxedProcessLauncherDelegate* delegate, |
| 198 bool run_elevated, |
| 186 #elif defined(OS_ANDROID) | 199 #elif defined(OS_ANDROID) |
| 187 int ipcfd, | 200 int ipcfd, |
| 188 #elif defined(OS_POSIX) | 201 #elif defined(OS_POSIX) |
| 189 bool use_zygote, | 202 bool use_zygote, |
| 190 const base::EnvironmentMap& env, | 203 const base::EnvironmentMap& env, |
| 191 int ipcfd, | 204 int ipcfd, |
| 192 #endif | 205 #endif |
| 193 CommandLine* cmd_line) { | 206 CommandLine* cmd_line) { |
| 194 scoped_ptr<CommandLine> cmd_line_deleter(cmd_line); | 207 scoped_ptr<CommandLine> cmd_line_deleter(cmd_line); |
| 195 base::TimeTicks begin_launch_time = base::TimeTicks::Now(); | 208 base::TimeTicks begin_launch_time = base::TimeTicks::Now(); |
| 196 | 209 |
| 210 |
| 197 #if defined(OS_WIN) | 211 #if defined(OS_WIN) |
| 198 scoped_ptr<SandboxedProcessLauncherDelegate> delegate_deleter(delegate); | 212 scoped_ptr<SandboxedProcessLauncherDelegate> delegate_deleter(delegate); |
| 199 base::ProcessHandle handle = StartSandboxedProcess(delegate, cmd_line); | 213 base::ProcessHandle handle; |
| 214 if (run_elevated) { |
| 215 base::LaunchOptions options; |
| 216 options.run_elevated = run_elevated; |
| 217 base::LaunchProcess(*cmd_line, options, &handle); |
| 218 } else { |
| 219 handle = StartSandboxedProcess(delegate, cmd_line); |
| 220 } |
| 200 #elif defined(OS_ANDROID) | 221 #elif defined(OS_ANDROID) |
| 201 // Android WebView runs in single process, ensure that we never get here | 222 // Android WebView runs in single process, ensure that we never get here |
| 202 // when running in single process mode. | 223 // when running in single process mode. |
| 203 CHECK(!cmd_line->HasSwitch(switches::kSingleProcess)); | 224 CHECK(!cmd_line->HasSwitch(switches::kSingleProcess)); |
| 204 | 225 |
| 205 std::string process_type = | 226 std::string process_type = |
| 206 cmd_line->GetSwitchValueASCII(switches::kProcessType); | 227 cmd_line->GetSwitchValueASCII(switches::kProcessType); |
| 207 std::vector<FileDescriptorInfo> files_to_register; | 228 std::vector<FileDescriptorInfo> files_to_register; |
| 208 files_to_register.push_back( | 229 files_to_register.push_back( |
| 209 FileDescriptorInfo(kPrimaryIPCChannel, | 230 FileDescriptorInfo(kPrimaryIPCChannel, |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 #elif defined(OS_POSIX) | 451 #elif defined(OS_POSIX) |
| 431 use_zygote, | 452 use_zygote, |
| 432 environ, | 453 environ, |
| 433 ipcfd, | 454 ipcfd, |
| 434 #endif | 455 #endif |
| 435 cmd_line, | 456 cmd_line, |
| 436 child_process_id, | 457 child_process_id, |
| 437 client); | 458 client); |
| 438 } | 459 } |
| 439 | 460 |
| 461 #if defined(OS_WIN) |
| 462 ChildProcessLauncher::ChildProcessLauncher( |
| 463 SandboxedProcessLauncherDelegate* delegate, |
| 464 bool run_elevated, |
| 465 CommandLine* cmd_line, |
| 466 int child_process_id, |
| 467 Client* client) { |
| 468 context_ = new Context(); |
| 469 context_->Launch( |
| 470 delegate, |
| 471 run_elevated, |
| 472 cmd_line, |
| 473 child_process_id, |
| 474 client); |
| 475 } |
| 476 #endif |
| 477 |
| 440 ChildProcessLauncher::~ChildProcessLauncher() { | 478 ChildProcessLauncher::~ChildProcessLauncher() { |
| 441 context_->ResetClient(); | 479 context_->ResetClient(); |
| 442 } | 480 } |
| 443 | 481 |
| 444 bool ChildProcessLauncher::IsStarting() { | 482 bool ChildProcessLauncher::IsStarting() { |
| 445 return context_->starting_; | 483 return context_->starting_; |
| 446 } | 484 } |
| 447 | 485 |
| 448 base::ProcessHandle ChildProcessLauncher::GetHandle() { | 486 base::ProcessHandle ChildProcessLauncher::GetHandle() { |
| 449 DCHECK(!context_->starting_); | 487 DCHECK(!context_->starting_); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 GetHandle(), background)); | 537 GetHandle(), background)); |
| 500 } | 538 } |
| 501 | 539 |
| 502 void ChildProcessLauncher::SetTerminateChildOnShutdown( | 540 void ChildProcessLauncher::SetTerminateChildOnShutdown( |
| 503 bool terminate_on_shutdown) { | 541 bool terminate_on_shutdown) { |
| 504 if (context_.get()) | 542 if (context_.get()) |
| 505 context_->set_terminate_child_on_shutdown(terminate_on_shutdown); | 543 context_->set_terminate_child_on_shutdown(terminate_on_shutdown); |
| 506 } | 544 } |
| 507 | 545 |
| 508 } // namespace content | 546 } // namespace content |
| OLD | NEW |