You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by an...@apache.org on 2018/03/06 23:24:32 UTC

[7/8] mesos git commit: Changed `os::spawn()` to return `Option` instead of `int`.

Changed `os::spawn()` to return `Option<int>` instead of `int`.

Similar to `os::system()`, `os::spawn()` returned `-1` on error, which
is a valid exit code on Windows. Using the same solution as
`os::system()`, now when `os::spawn()` fails, `None()` will be
returned. Otherwise, the process exit code will be returned.

Review: https://reviews.apache.org/r/65842/


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/1971a547
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/1971a547
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/1971a547

Branch: refs/heads/master
Commit: 1971a5477f9a0ad9c5c542a0377b32fd7936a219
Parents: 765c834
Author: Akash Gupta <ak...@hotmail.com>
Authored: Tue Mar 6 13:11:25 2018 -0800
Committer: Andrew Schwartzmeyer <an...@schwartzmeyer.com>
Committed: Tue Mar 6 13:52:47 2018 -0800

----------------------------------------------------------------------
 .../stout/include/stout/os/posix/copyfile.hpp   | 11 +++++-----
 3rdparty/stout/include/stout/os/posix/shell.hpp | 17 ++++++++--------
 .../stout/include/stout/os/windows/shell.hpp    | 21 ++++++++------------
 3 files changed, 23 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/1971a547/3rdparty/stout/include/stout/os/posix/copyfile.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/stout/include/stout/os/posix/copyfile.hpp b/3rdparty/stout/include/stout/os/posix/copyfile.hpp
index 0d9ed5b..bb5ec71 100644
--- a/3rdparty/stout/include/stout/os/posix/copyfile.hpp
+++ b/3rdparty/stout/include/stout/os/posix/copyfile.hpp
@@ -17,11 +17,12 @@
 
 #include <stout/error.hpp>
 #include <stout/nothing.hpp>
-#include <stout/os/stat.hpp>
+#include <stout/option.hpp>
 #include <stout/path.hpp>
 #include <stout/stringify.hpp>
 #include <stout/try.hpp>
 
+#include <stout/os/stat.hpp>
 
 namespace os {
 
@@ -56,14 +57,14 @@ inline Try<Nothing> copyfile(
     return Error("`destination` was a relative path");
   }
 
-  const int status = os::spawn("cp", {"cp", source, destination});
+  const Option<int> status = os::spawn("cp", {"cp", source, destination});
 
-  if (status == -1) {
+  if (status.isNone()) {
     return ErrnoError("os::spawn failed");
   }
 
-  if (!(WIFEXITED(status) && WEXITSTATUS(status) == 0)) {
-    return Error("cp failed with status: " + stringify(status));
+  if (!(WIFEXITED(status.get()) && WEXITSTATUS(status.get()) == 0)) {
+    return Error("cp failed with status: " + stringify(status.get()));
   }
 
   return Nothing();

http://git-wip-us.apache.org/repos/asf/mesos/blob/1971a547/3rdparty/stout/include/stout/os/posix/shell.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/stout/include/stout/os/posix/shell.hpp b/3rdparty/stout/include/stout/os/posix/shell.hpp
index b6e3deb..de6ef23 100644
--- a/3rdparty/stout/include/stout/os/posix/shell.hpp
+++ b/3rdparty/stout/include/stout/os/posix/shell.hpp
@@ -153,19 +153,20 @@ inline Option<int> system(const std::string& command)
   }
 }
 
-// Executes a command by calling "<command> <arguments...>", and
-// returns after the command has been completed. Returns 0 if
-// succeeds, and -1 on error (e.g., fork/exec/waitpid failed). This
-// function is async signal safe. We return int instead of returning a
-// Try because Try involves 'new', which is not async signal safe.
-inline int spawn(
+// Executes a command by calling "<command> <arguments...>", and returns after
+// the command has been completed. Returns the exit code on success and `None`
+// on error (e.g., fork/exec/waitpid failed). This function is async signal
+// safe. We return an `Option<int>` instead of a `Try<int>`, because although
+// `Try` does not dynamically allocate, `Error` uses `std::string`, which is
+// not async signal safe.
+inline Option<int> spawn(
     const std::string& command,
     const std::vector<std::string>& arguments)
 {
   pid_t pid = ::fork();
 
   if (pid == -1) {
-    return -1;
+    return None();
   } else if (pid == 0) {
     // In child process.
     ::execvp(command.c_str(), os::raw::Argv(arguments));
@@ -175,7 +176,7 @@ inline int spawn(
     int status;
     while (::waitpid(pid, &status, 0) == -1) {
       if (errno != EINTR) {
-        return -1;
+        return None();
       }
     }
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/1971a547/3rdparty/stout/include/stout/os/windows/shell.hpp
----------------------------------------------------------------------
diff --git a/3rdparty/stout/include/stout/os/windows/shell.hpp b/3rdparty/stout/include/stout/os/windows/shell.hpp
index c0b9efa..aacd746 100644
--- a/3rdparty/stout/include/stout/os/windows/shell.hpp
+++ b/3rdparty/stout/include/stout/os/windows/shell.hpp
@@ -362,9 +362,9 @@ inline int execlp(const char* file, T... t) = delete;
 
 
 // Executes a command by calling "<command> <arguments...>", and
-// returns after the command has been completed. Returns process exit code if
-// succeeds, and -1 on error.
-inline int spawn(
+// returns after the command has been completed. Returns the process exit
+// code on success and `None` on error.
+inline Option<int> spawn(
     const std::string& command,
     const std::vector<std::string>& arguments,
     const Option<std::map<std::string, std::string>>& environment = None())
@@ -374,7 +374,7 @@ inline int spawn(
 
   if (process_data.isError()) {
     LOG(WARNING) << process_data.error();
-    return -1;
+    return None();
   }
 
   // Wait for the process synchronously.
@@ -386,7 +386,7 @@ inline int spawn(
            process_data->process_handle.get_handle(),
            &status)) {
     LOG(WARNING) << "Failed to `GetExitCodeProcess`: " << command;
-    return -1;
+    return None();
   }
 
   // Return the child exit code.
@@ -405,12 +405,7 @@ inline int spawn(
 // preferred if a shell is not required.
 inline Option<int> system(const std::string& command)
 {
-  // TODO(akagup): Change `os::spawn` to return `Option<int>` as well.
-  int pid = os::spawn(Shell::name, {Shell::arg0, Shell::arg1, command});
-  if (pid == -1) {
-    return None();
-  }
-  return pid;
+  return os::spawn(Shell::name, {Shell::arg0, Shell::arg1, command});
 }
 
 
@@ -421,7 +416,7 @@ inline int execvp(
     const std::string& command,
     const std::vector<std::string>& argv)
 {
-  exit(os::spawn(command, argv));
+  exit(os::spawn(command, argv).getOrElse(-1));
   return -1;
 }
 
@@ -434,7 +429,7 @@ inline int execvpe(
     const std::vector<std::string>& argv,
     const std::map<std::string, std::string>& envp)
 {
-  exit(os::spawn(command, argv, envp));
+  exit(os::spawn(command, argv, envp).getOrElse(-1));
   return -1;
 }