| Index: base/process_util_posix.cc
|
| diff --git a/base/process_util_posix.cc b/base/process_util_posix.cc
|
| index a2398edd0af67c71219d9c2de9dd073d79bf9584..b41ca4bc1e974580ff95eaf64701633782c7894c 100644
|
| --- a/base/process_util_posix.cc
|
| +++ b/base/process_util_posix.cc
|
| @@ -508,7 +508,9 @@ bool LaunchAppImpl(
|
| const file_handle_mapping_vector& fds_to_remap,
|
| bool wait,
|
| ProcessHandle* process_handle,
|
| - bool start_new_process_group) {
|
| + bool start_new_process_group,
|
| + bool use_clone,
|
| + int clone_flags) {
|
| pid_t pid;
|
| InjectiveMultimap fd_shuffle1, fd_shuffle2;
|
| fd_shuffle1.reserve(fds_to_remap.size());
|
| @@ -516,7 +518,15 @@ bool LaunchAppImpl(
|
| scoped_array<char*> argv_cstr(new char*[argv.size() + 1]);
|
| scoped_array<char*> new_environ(AlterEnvironment(env_changes, environ));
|
|
|
| - pid = fork();
|
| + if (use_clone) {
|
| +#if defined(OS_LINUX)
|
| + pid = syscall(__NR_clone, clone_flags, 0, 0, 0);
|
| +#else
|
| + NOTREACHED() << "Tried to use clone() on non-Linux system.";
|
| +#endif
|
| + } else {
|
| + pid = fork();
|
| + }
|
| if (pid < 0) {
|
| PLOG(ERROR) << "fork";
|
| return false;
|
| @@ -617,7 +627,10 @@ bool LaunchApp(
|
| bool wait,
|
| ProcessHandle* process_handle) {
|
| return LaunchAppImpl(argv, env_changes, fds_to_remap,
|
| - wait, process_handle, false);
|
| + wait, process_handle,
|
| + false, // don't start new process group
|
| + false, // don't use clone()
|
| + 0); // clone flags
|
| }
|
|
|
| bool LaunchAppInNewProcessGroup(
|
| @@ -627,7 +640,21 @@ bool LaunchAppInNewProcessGroup(
|
| bool wait,
|
| ProcessHandle* process_handle) {
|
| return LaunchAppImpl(argv, env_changes, fds_to_remap, wait,
|
| - process_handle, true);
|
| + process_handle,
|
| + true, // start new process group
|
| + false, // don't use clone()
|
| + 0); // clone flags
|
| +}
|
| +
|
| +BASE_API bool LaunchAppWithClone(const std::vector<std::string>& argv,
|
| + const file_handle_mapping_vector& fds_to_remap,
|
| + bool wait, ProcessHandle* process_handle,
|
| + int clone_flags) {
|
| + base::environment_vector no_env;
|
| + return LaunchAppImpl(argv, no_env, fds_to_remap, wait, process_handle,
|
| + false, // don't start new process group
|
| + true, // use clone()
|
| + clone_flags);
|
| }
|
|
|
| bool LaunchApp(const std::vector<std::string>& argv,
|
|
|