OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "chrome/browser/child_process_launcher.h" | 5 #include "chrome/browser/child_process_launcher.h" |
6 | 6 |
7 #include <utility> // For std::pair. | 7 #include <utility> // For std::pair. |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/lock.h" | 10 #include "base/lock.h" |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 | 303 |
304 bool ChildProcessLauncher::IsStarting() { | 304 bool ChildProcessLauncher::IsStarting() { |
305 return context_->starting_; | 305 return context_->starting_; |
306 } | 306 } |
307 | 307 |
308 base::ProcessHandle ChildProcessLauncher::GetHandle() { | 308 base::ProcessHandle ChildProcessLauncher::GetHandle() { |
309 DCHECK(!context_->starting_); | 309 DCHECK(!context_->starting_); |
310 return context_->process_.handle(); | 310 return context_->process_.handle(); |
311 } | 311 } |
312 | 312 |
313 bool ChildProcessLauncher::DidProcessCrash() { | 313 base::TerminationStatus ChildProcessLauncher::GetChildTerminationStatus( |
314 bool did_crash, child_exited; | 314 int* exit_code) { |
| 315 base::TerminationStatus status; |
315 base::ProcessHandle handle = context_->process_.handle(); | 316 base::ProcessHandle handle = context_->process_.handle(); |
316 #if defined(OS_LINUX) | 317 #if defined(OS_LINUX) |
317 if (context_->zygote_) { | 318 if (context_->zygote_) { |
318 did_crash = Singleton<ZygoteHost>()->DidProcessCrash(handle, &child_exited); | 319 status = Singleton<ZygoteHost>()->GetTerminationStatus(handle, |
| 320 exit_code); |
319 } else | 321 } else |
320 #endif | 322 #endif |
321 { | 323 { |
322 did_crash = base::DidProcessCrash(&child_exited, handle); | 324 status = base::GetTerminationStatus(handle, exit_code); |
323 } | 325 } |
324 | 326 |
325 // POSIX: If the process crashed, then the kernel closed the socket for it | 327 // POSIX: If the process crashed, then the kernel closed the socket |
326 // and so the child has already died by the time we get here. Since | 328 // for it and so the child has already died by the time we get |
327 // DidProcessCrash called waitpid with WNOHANG, it'll reap the process. | 329 // here. Since GetTerminationStatus called waitpid with WNOHANG, |
328 // However, if DidProcessCrash didn't reap the child, we'll need to in | 330 // it'll reap the process. However, if GetTerminationStatus didn't |
| 331 // reap the child (because it was still running), we'll need to |
329 // Terminate via ProcessWatcher. So we can't close the handle here. | 332 // Terminate via ProcessWatcher. So we can't close the handle here. |
330 if (child_exited) | 333 if (status != base::TERMINATION_STATUS_STILL_RUNNING) |
331 context_->process_.Close(); | 334 context_->process_.Close(); |
332 | 335 |
333 return did_crash; | 336 return status; |
334 } | 337 } |
335 | 338 |
336 void ChildProcessLauncher::SetProcessBackgrounded(bool background) { | 339 void ChildProcessLauncher::SetProcessBackgrounded(bool background) { |
337 DCHECK(!context_->starting_); | 340 DCHECK(!context_->starting_); |
338 context_->process_.SetProcessBackgrounded(background); | 341 context_->process_.SetProcessBackgrounded(background); |
339 } | 342 } |
OLD | NEW |