Index: base/process/launch.h |
diff --git a/base/process/launch.h b/base/process/launch.h |
index 6cd02d63cabf3dfe556411c6a8d2202a8a7ffff7..eca4f8f7a44eeb1af2b0625dff6bc3f0b32b60d3 100644 |
--- a/base/process/launch.h |
+++ b/base/process/launch.h |
@@ -37,6 +37,24 @@ typedef std::vector<std::pair<int, int> > FileHandleMappingVector; |
// Options for launching a subprocess that are passed to LaunchProcess(). |
// The default constructor constructs the object with default options. |
struct BASE_EXPORT LaunchOptions { |
+#if defined(OS_POSIX) |
+ // Delegate to be run in between fork and exec in the subprocess (see |
+ // pre_exec_delegate below) |
+ class BASE_EXPORT PreExecDelegate { |
+ public: |
+ PreExecDelegate() {} |
+ virtual ~PreExecDelegate() {} |
+ |
+ // Since this is to be run between fork and exec, and fork may have happened |
+ // while multiple threads were running, this function needs to be async |
+ // safe. |
+ virtual void RunAsyncSafe() = 0; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(PreExecDelegate); |
+ }; |
+#endif // defined(OS_POSIX) |
+ |
LaunchOptions(); |
~LaunchOptions(); |
@@ -115,6 +133,9 @@ struct BASE_EXPORT LaunchOptions { |
#if defined(OS_LINUX) |
// If non-zero, start the process using clone(), using flags as provided. |
+ // Unlike in clone, clone_flags may not contain a custom termination signal |
+ // that is sent to the parent when the child dies. The termination signal will |
+ // always be set to SIGCHLD. |
int clone_flags; |
// By default, child processes will have the PR_SET_NO_NEW_PRIVS bit set. If |
@@ -122,6 +143,16 @@ struct BASE_EXPORT LaunchOptions { |
bool allow_new_privs; |
#endif // defined(OS_LINUX) |
+#if defined(OS_POSIX) |
+ // If non-null, a delegate to be run immediately prior to executing the new |
+ // program in the child process. |
+ // |
+ // WARNING: If LaunchProcess is called in the presence of multiple threads, |
+ // code running in this delegate essentially needs to be async-signal safe |
+ // (see man 7 signal for a list of allowed functions). |
+ PreExecDelegate* pre_exec_delegate; |
+#endif // defined(OS_POSIX) |
+ |
#if defined(OS_CHROMEOS) |
// If non-negative, the specified file descriptor will be set as the launched |
// process' controlling terminal. |
@@ -156,12 +187,6 @@ struct BASE_EXPORT LaunchOptions { |
BASE_EXPORT Process LaunchProcess(const CommandLine& cmdline, |
const LaunchOptions& options); |
-// Deprecated version. |
-// TODO(rvargas) crbug.com/417532: Remove this after migrating all consumers. |
-BASE_EXPORT bool LaunchProcess(const CommandLine& cmdline, |
- const LaunchOptions& options, |
- ProcessHandle* process_handle); |
- |
#if defined(OS_WIN) |
// Windows-specific LaunchProcess that takes the command line as a |
// string. Useful for situations where you need to control the |
@@ -192,12 +217,6 @@ BASE_EXPORT Process LaunchElevatedProcess(const CommandLine& cmdline, |
BASE_EXPORT Process LaunchProcess(const std::vector<std::string>& argv, |
const LaunchOptions& options); |
-// Deprecated version. |
-// TODO(rvargas) crbug.com/417532: Remove this after migrating all consumers. |
-BASE_EXPORT bool LaunchProcess(const std::vector<std::string>& argv, |
- const LaunchOptions& options, |
- ProcessHandle* process_handle); |
- |
// Close all file descriptors, except those which are a destination in the |
// given multimap. Only call this function in a child process where you know |
// that there aren't any other threads. |