Index: base/process/launch_posix.cc |
diff --git a/base/process/launch_posix.cc b/base/process/launch_posix.cc |
index c60cfdc9fc430a181f09d904a20b99b70dbe4740..6c9ed3ff3db801371c3e193f0d933923773c0380 100644 |
--- a/base/process/launch_posix.cc |
+++ b/base/process/launch_posix.cc |
@@ -277,9 +277,13 @@ void CloseSuperfluousFds(const base::InjectiveMultimap& saved_mapping) { |
} |
} |
-bool LaunchProcess(const std::vector<std::string>& argv, |
- const LaunchOptions& options, |
- ProcessHandle* process_handle) { |
+Process LaunchProcess(const CommandLine& cmdline, |
+ const LaunchOptions& options) { |
+ return LaunchProcess(cmdline.argv(), options); |
+} |
+ |
+Process LaunchProcess(const std::vector<std::string>& argv, |
+ const LaunchOptions& options) { |
size_t fd_shuffle_size = 0; |
if (options.fds_to_remap) { |
fd_shuffle_size = options.fds_to_remap->size(); |
@@ -311,7 +315,17 @@ bool LaunchProcess(const std::vector<std::string>& argv, |
// and that signal handling follows the process-creation rules. |
RAW_CHECK( |
!(options.clone_flags & (CLONE_SIGHAND | CLONE_THREAD | CLONE_VM))); |
- pid = syscall(__NR_clone, options.clone_flags, 0, 0, 0); |
+ |
+ // We specify a null ptid and ctid. |
+ RAW_CHECK( |
+ !(options.clone_flags & |
+ (CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID | CLONE_PARENT_SETTID))); |
+ |
+ // Since we use waitpid, we do not support custom termination signals in the |
+ // clone flags. |
+ RAW_CHECK((options.clone_flags & 0xff) == 0); |
+ |
+ pid = ForkWithFlags(options.clone_flags | SIGCHLD, nullptr, nullptr); |
} else |
#endif |
{ |
@@ -325,7 +339,7 @@ bool LaunchProcess(const std::vector<std::string>& argv, |
if (pid < 0) { |
DPLOG(ERROR) << "fork"; |
- return false; |
+ return Process(); |
} else if (pid == 0) { |
// Child process |
@@ -448,6 +462,12 @@ bool LaunchProcess(const std::vector<std::string>& argv, |
} |
#endif |
+#if defined(OS_POSIX) |
+ if (options.pre_exec_delegate != nullptr) { |
+ options.pre_exec_delegate->RunAsyncSafe(); |
+ } |
+#endif |
+ |
for (size_t i = 0; i < argv.size(); i++) |
argv_cstr[i] = const_cast<char*>(argv[i].c_str()); |
argv_cstr[argv.size()] = NULL; |
@@ -465,37 +485,9 @@ bool LaunchProcess(const std::vector<std::string>& argv, |
pid_t ret = HANDLE_EINTR(waitpid(pid, 0, 0)); |
DPCHECK(ret > 0); |
} |
- |
- if (process_handle) |
- *process_handle = pid; |
} |
- return true; |
-} |
- |
-Process LaunchProcess(const std::vector<std::string>& argv, |
- const LaunchOptions& options) { |
- ProcessHandle process_handle; |
- if (LaunchProcess(argv, options, &process_handle)) |
- return Process(process_handle); |
- |
- return Process(); |
-} |
- |
- |
-bool LaunchProcess(const CommandLine& cmdline, |
- const LaunchOptions& options, |
- ProcessHandle* process_handle) { |
- return LaunchProcess(cmdline.argv(), options, process_handle); |
-} |
- |
-Process LaunchProcess(const CommandLine& cmdline, |
- const LaunchOptions& options) { |
- ProcessHandle process_handle; |
- if (LaunchProcess(cmdline, options, &process_handle)) |
- return Process(process_handle); |
- |
- return Process(); |
+ return Process(pid); |
} |
void RaiseProcessToHighPriority() { |