Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <dirent.h> | 5 #include <dirent.h> |
| 6 #include <errno.h> | 6 #include <errno.h> |
| 7 #include <fcntl.h> | 7 #include <fcntl.h> |
| 8 #include <signal.h> | 8 #include <signal.h> |
| 9 #include <stdlib.h> | 9 #include <stdlib.h> |
| 10 #include <sys/resource.h> | 10 #include <sys/resource.h> |
| (...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 501 ret[k] = NULL; | 501 ret[k] = NULL; |
| 502 return ret; | 502 return ret; |
| 503 } | 503 } |
| 504 | 504 |
| 505 bool LaunchAppImpl( | 505 bool LaunchAppImpl( |
| 506 const std::vector<std::string>& argv, | 506 const std::vector<std::string>& argv, |
| 507 const environment_vector& env_changes, | 507 const environment_vector& env_changes, |
| 508 const file_handle_mapping_vector& fds_to_remap, | 508 const file_handle_mapping_vector& fds_to_remap, |
| 509 bool wait, | 509 bool wait, |
| 510 ProcessHandle* process_handle, | 510 ProcessHandle* process_handle, |
| 511 bool start_new_process_group) { | 511 bool start_new_process_group, |
| 512 bool use_clone, | |
| 513 int clone_flags) { | |
| 512 pid_t pid; | 514 pid_t pid; |
| 513 InjectiveMultimap fd_shuffle1, fd_shuffle2; | 515 InjectiveMultimap fd_shuffle1, fd_shuffle2; |
| 514 fd_shuffle1.reserve(fds_to_remap.size()); | 516 fd_shuffle1.reserve(fds_to_remap.size()); |
| 515 fd_shuffle2.reserve(fds_to_remap.size()); | 517 fd_shuffle2.reserve(fds_to_remap.size()); |
| 516 scoped_array<char*> argv_cstr(new char*[argv.size() + 1]); | 518 scoped_array<char*> argv_cstr(new char*[argv.size() + 1]); |
| 517 scoped_array<char*> new_environ(AlterEnvironment(env_changes, environ)); | 519 scoped_array<char*> new_environ(AlterEnvironment(env_changes, environ)); |
| 518 | 520 |
| 519 pid = fork(); | 521 if (use_clone) { |
| 522 #if defined(OS_LINUX) | |
| 523 pid = syscall(__NR_clone, clone_flags, 0, 0, 0); | |
| 524 #else | |
| 525 NOTREACHED(); | |
| 526 LOG(ERROR) << "Tried to use clone() on non-Linux system."; | |
|
darin (slow to review)
2011/06/24 16:32:19
it seems like we should only reach this code in a
Brad Chen
2011/06/24 16:52:12
Done.
| |
| 527 #endif | |
| 528 } else { | |
| 529 pid = fork(); | |
| 530 } | |
| 520 if (pid < 0) { | 531 if (pid < 0) { |
| 521 PLOG(ERROR) << "fork"; | 532 PLOG(ERROR) << "fork"; |
| 522 return false; | 533 return false; |
| 523 } | 534 } |
| 524 if (pid == 0) { | 535 if (pid == 0) { |
| 525 // Child process | 536 // Child process |
| 526 | 537 |
| 527 // DANGER: fork() rule: in the child, if you don't end up doing exec*(), | 538 // DANGER: fork() rule: in the child, if you don't end up doing exec*(), |
| 528 // you call _exit() instead of exit(). This is because _exit() does not | 539 // you call _exit() instead of exit(). This is because _exit() does not |
| 529 // call any previously-registered (in the parent) exit handlers, which | 540 // call any previously-registered (in the parent) exit handlers, which |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 610 return true; | 621 return true; |
| 611 } | 622 } |
| 612 | 623 |
| 613 bool LaunchApp( | 624 bool LaunchApp( |
| 614 const std::vector<std::string>& argv, | 625 const std::vector<std::string>& argv, |
| 615 const environment_vector& env_changes, | 626 const environment_vector& env_changes, |
| 616 const file_handle_mapping_vector& fds_to_remap, | 627 const file_handle_mapping_vector& fds_to_remap, |
| 617 bool wait, | 628 bool wait, |
| 618 ProcessHandle* process_handle) { | 629 ProcessHandle* process_handle) { |
| 619 return LaunchAppImpl(argv, env_changes, fds_to_remap, | 630 return LaunchAppImpl(argv, env_changes, fds_to_remap, |
| 620 wait, process_handle, false); | 631 wait, process_handle, |
| 632 false, // don't start new process group | |
| 633 false, // don't use clone() | |
| 634 0); // clone flags | |
| 621 } | 635 } |
| 622 | 636 |
| 623 bool LaunchAppInNewProcessGroup( | 637 bool LaunchAppInNewProcessGroup( |
| 624 const std::vector<std::string>& argv, | 638 const std::vector<std::string>& argv, |
| 625 const environment_vector& env_changes, | 639 const environment_vector& env_changes, |
| 626 const file_handle_mapping_vector& fds_to_remap, | 640 const file_handle_mapping_vector& fds_to_remap, |
| 627 bool wait, | 641 bool wait, |
| 628 ProcessHandle* process_handle) { | 642 ProcessHandle* process_handle) { |
| 629 return LaunchAppImpl(argv, env_changes, fds_to_remap, wait, | 643 return LaunchAppImpl(argv, env_changes, fds_to_remap, wait, |
| 630 process_handle, true); | 644 process_handle, |
| 645 true, // start new process group | |
| 646 false, // don't use clone() | |
| 647 0); // clone flags | |
| 648 } | |
| 649 | |
| 650 BASE_API bool LaunchAppWithClone(const std::vector<std::string>& argv, | |
| 651 const file_handle_mapping_vector& fds_to_remap, | |
| 652 bool wait, ProcessHandle* process_handle, | |
| 653 int clone_flags) { | |
| 654 base::environment_vector no_env; | |
| 655 return LaunchAppImpl(argv, no_env, fds_to_remap, wait, process_handle, | |
| 656 false, // don't start new process group | |
| 657 true, // use clone() | |
|
darin (slow to review)
2011/06/24 16:32:19
nit: elsewhere, you stack the comments in a column
Brad Chen
2011/06/24 16:52:12
Fixed.
| |
| 658 clone_flags); | |
| 631 } | 659 } |
| 632 | 660 |
| 633 bool LaunchApp(const std::vector<std::string>& argv, | 661 bool LaunchApp(const std::vector<std::string>& argv, |
| 634 const file_handle_mapping_vector& fds_to_remap, | 662 const file_handle_mapping_vector& fds_to_remap, |
| 635 bool wait, ProcessHandle* process_handle) { | 663 bool wait, ProcessHandle* process_handle) { |
| 636 base::environment_vector no_env; | 664 base::environment_vector no_env; |
| 637 return LaunchApp(argv, no_env, fds_to_remap, wait, process_handle); | 665 return LaunchApp(argv, no_env, fds_to_remap, wait, process_handle); |
| 638 } | 666 } |
| 639 | 667 |
| 640 bool LaunchApp(const CommandLine& cl, | 668 bool LaunchApp(const CommandLine& cl, |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1005 const ProcessFilter* filter) { | 1033 const ProcessFilter* filter) { |
| 1006 bool exited_cleanly = | 1034 bool exited_cleanly = |
| 1007 WaitForProcessesToExit(executable_name, wait_milliseconds, | 1035 WaitForProcessesToExit(executable_name, wait_milliseconds, |
| 1008 filter); | 1036 filter); |
| 1009 if (!exited_cleanly) | 1037 if (!exited_cleanly) |
| 1010 KillProcesses(executable_name, exit_code, filter); | 1038 KillProcesses(executable_name, exit_code, filter); |
| 1011 return exited_cleanly; | 1039 return exited_cleanly; |
| 1012 } | 1040 } |
| 1013 | 1041 |
| 1014 } // namespace base | 1042 } // namespace base |
| OLD | NEW |