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, | 512 pid_t pid; |
513 int clone_flags) { | |
514 pid_t pid = -1; | |
515 InjectiveMultimap fd_shuffle1, fd_shuffle2; | 513 InjectiveMultimap fd_shuffle1, fd_shuffle2; |
516 fd_shuffle1.reserve(fds_to_remap.size()); | 514 fd_shuffle1.reserve(fds_to_remap.size()); |
517 fd_shuffle2.reserve(fds_to_remap.size()); | 515 fd_shuffle2.reserve(fds_to_remap.size()); |
518 scoped_array<char*> argv_cstr(new char*[argv.size() + 1]); | 516 scoped_array<char*> argv_cstr(new char*[argv.size() + 1]); |
519 scoped_array<char*> new_environ(AlterEnvironment(env_changes, environ)); | 517 scoped_array<char*> new_environ(AlterEnvironment(env_changes, environ)); |
520 | 518 |
521 if (use_clone) { | 519 pid = fork(); |
522 #if defined(OS_LINUX) | |
523 pid = syscall(__NR_clone, clone_flags, 0, 0, 0); | |
524 #else | |
525 NOTREACHED() << "Tried to use clone() on non-Linux system."; | |
526 #endif | |
527 } else { | |
528 pid = fork(); | |
529 } | |
530 if (pid < 0) { | 520 if (pid < 0) { |
531 PLOG(ERROR) << "fork"; | 521 PLOG(ERROR) << "fork"; |
532 return false; | 522 return false; |
533 } | 523 } |
534 if (pid == 0) { | 524 if (pid == 0) { |
535 // Child process | 525 // Child process |
536 | 526 |
537 // DANGER: fork() rule: in the child, if you don't end up doing exec*(), | 527 // DANGER: fork() rule: in the child, if you don't end up doing exec*(), |
538 // you call _exit() instead of exit(). This is because _exit() does not | 528 // you call _exit() instead of exit(). This is because _exit() does not |
539 // call any previously-registered (in the parent) exit handlers, which | 529 // call any previously-registered (in the parent) exit handlers, which |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 return true; | 610 return true; |
621 } | 611 } |
622 | 612 |
623 bool LaunchApp( | 613 bool LaunchApp( |
624 const std::vector<std::string>& argv, | 614 const std::vector<std::string>& argv, |
625 const environment_vector& env_changes, | 615 const environment_vector& env_changes, |
626 const file_handle_mapping_vector& fds_to_remap, | 616 const file_handle_mapping_vector& fds_to_remap, |
627 bool wait, | 617 bool wait, |
628 ProcessHandle* process_handle) { | 618 ProcessHandle* process_handle) { |
629 return LaunchAppImpl(argv, env_changes, fds_to_remap, | 619 return LaunchAppImpl(argv, env_changes, fds_to_remap, |
630 wait, process_handle, | 620 wait, process_handle, false); |
631 false, // don't start new process group | |
632 false, // don't use clone() | |
633 0); // clone flags | |
634 } | 621 } |
635 | 622 |
636 bool LaunchAppInNewProcessGroup( | 623 bool LaunchAppInNewProcessGroup( |
637 const std::vector<std::string>& argv, | 624 const std::vector<std::string>& argv, |
638 const environment_vector& env_changes, | 625 const environment_vector& env_changes, |
639 const file_handle_mapping_vector& fds_to_remap, | 626 const file_handle_mapping_vector& fds_to_remap, |
640 bool wait, | 627 bool wait, |
641 ProcessHandle* process_handle) { | 628 ProcessHandle* process_handle) { |
642 return LaunchAppImpl(argv, env_changes, fds_to_remap, wait, | 629 return LaunchAppImpl(argv, env_changes, fds_to_remap, wait, |
643 process_handle, | 630 process_handle, true); |
644 true, // start new process group | |
645 false, // don't use clone() | |
646 0); // clone flags | |
647 } | |
648 | |
649 BASE_API bool LaunchAppWithClone(const std::vector<std::string>& argv, | |
650 const file_handle_mapping_vector& fds_to_remap, | |
651 bool wait, ProcessHandle* process_handle, | |
652 int clone_flags) { | |
653 base::environment_vector no_env; | |
654 return LaunchAppImpl(argv, no_env, fds_to_remap, wait, process_handle, | |
655 false, // don't start new process group | |
656 true, // use clone() | |
657 clone_flags); | |
658 } | 631 } |
659 | 632 |
660 bool LaunchApp(const std::vector<std::string>& argv, | 633 bool LaunchApp(const std::vector<std::string>& argv, |
661 const file_handle_mapping_vector& fds_to_remap, | 634 const file_handle_mapping_vector& fds_to_remap, |
662 bool wait, ProcessHandle* process_handle) { | 635 bool wait, ProcessHandle* process_handle) { |
663 base::environment_vector no_env; | 636 base::environment_vector no_env; |
664 return LaunchApp(argv, no_env, fds_to_remap, wait, process_handle); | 637 return LaunchApp(argv, no_env, fds_to_remap, wait, process_handle); |
665 } | 638 } |
666 | 639 |
667 bool LaunchApp(const CommandLine& cl, | 640 bool LaunchApp(const CommandLine& cl, |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1032 const ProcessFilter* filter) { | 1005 const ProcessFilter* filter) { |
1033 bool exited_cleanly = | 1006 bool exited_cleanly = |
1034 WaitForProcessesToExit(executable_name, wait_milliseconds, | 1007 WaitForProcessesToExit(executable_name, wait_milliseconds, |
1035 filter); | 1008 filter); |
1036 if (!exited_cleanly) | 1009 if (!exited_cleanly) |
1037 KillProcesses(executable_name, exit_code, filter); | 1010 KillProcesses(executable_name, exit_code, filter); |
1038 return exited_cleanly; | 1011 return exited_cleanly; |
1039 } | 1012 } |
1040 | 1013 |
1041 } // namespace base | 1014 } // namespace base |
OLD | NEW |