[LLVMdev] [PATCH 2/2] Make Program::ExecuteNoWait return a process ID.

Mikhail Glushenkov foldr at codedgers.com
Thu Jul 16 18:04:36 PDT 2009


---
 include/llvm/System/Program.h |   14 ++++++++++----
 lib/System/Unix/Program.inc   |   17 +++++++++--------
 lib/System/Win32/Program.inc  |   16 +++++++++-------
 3 files changed, 28 insertions(+), 19 deletions(-)

diff --git a/include/llvm/System/Program.h b/include/llvm/System/Program.h
index 14f9e9e..05c73ac 100644
--- a/include/llvm/System/Program.h
+++ b/include/llvm/System/Program.h
@@ -15,6 +15,7 @@
 #define LLVM_SYSTEM_PROGRAM_H
 
 #include "llvm/System/Path.h"
+#include "llvm/Config/config.h"
 
 namespace llvm {
 namespace sys {
@@ -88,6 +89,12 @@ namespace sys {
       static bool ChangeStdoutToBinary();
     /// @}
 
+#ifdef LLVM_ON_WINDOWS
+    typedef unsigned ProcessID;
+#else
+    typedef int ProcessID;
+#endif
+
      /// This function executes the program using the \p arguments provided and
      /// waits for the program to exit. This function will block the current
      /// program until the invoked program exits. The invoked program will
@@ -95,12 +102,11 @@ namespace sys {
      /// environment and other configuration settings of the invoking program.
      /// If Path::executable() does not return true when this function is
      /// called then a std::string is thrown.
-     /// @returns an integer result code indicating the status of the program.
-     /// A zero or positive value indicates the result code of the program. A
-     /// negative value is the signal number on which it terminated.
+     /// @returns the child process's process ID on success, or 0 if the
+     /// invocation failed.
      /// @see FindProgrambyName
      /// @brief Executes the program with the given set of \p args.
-     static void ExecuteNoWait(
+     static ProcessID ExecuteNoWait(
         const Path& path,  ///< sys::Path object providing the path of the
         ///< program to be executed. It is presumed this is the result of
         ///< the FindProgramByName method.
diff --git a/lib/System/Unix/Program.inc b/lib/System/Unix/Program.inc
index 342b45c..15f6e3f 100644
--- a/lib/System/Unix/Program.inc
+++ b/lib/System/Unix/Program.inc
@@ -274,7 +274,7 @@ Program::ExecuteAndWait(const Path& path,
 
 }
 
-void
+Program::ProcessID
 Program::ExecuteNoWait(const Path& path,
                        const char** args,
                        const char** envp,
@@ -285,36 +285,36 @@ Program::ExecuteNoWait(const Path& path,
   if (!path.canExecute()) {
     if (ErrMsg)
       *ErrMsg = path.toString() + " is not executable";
-    return;
+    return 0;
   }
 
   // Create a child process.
-  int child = fork();
+  ProcessID child = fork();
   switch (child) {
     // An error occured:  Return to the caller.
     case -1:
       MakeErrMsg(ErrMsg, "Couldn't fork");
-      return;
+      return 0;
 
     // Child process: Execute the program.
     case 0: {
       // Redirect file descriptors...
       if (redirects) {
         // Redirect stdin
-        if (RedirectIO(redirects[0], 0, ErrMsg)) { return; }
+        if (RedirectIO(redirects[0], 0, ErrMsg)) { return 0; }
         // Redirect stdout
-        if (RedirectIO(redirects[1], 1, ErrMsg)) { return; }
+        if (RedirectIO(redirects[1], 1, ErrMsg)) { return 0; }
         if (redirects[1] && redirects[2] &&
             *(redirects[1]) == *(redirects[2])) {
           // If stdout and stderr should go to the same place, redirect stderr
           // to the FD already open for stdout.
           if (-1 == dup2(1,2)) {
             MakeErrMsg(ErrMsg, "Can't redirect stderr to stdout");
-            return;
+            return 0;
           }
         } else {
           // Just redirect stderr
-          if (RedirectIO(redirects[2], 2, ErrMsg)) { return; }
+          if (RedirectIO(redirects[2], 2, ErrMsg)) { return 0; }
         }
       }
 
@@ -344,6 +344,7 @@ Program::ExecuteNoWait(const Path& path,
   fsync(1);
   fsync(2);
 
+  return child;
 }
 
 bool Program::ChangeStdinToBinary(){
diff --git a/lib/System/Win32/Program.inc b/lib/System/Win32/Program.inc
index 71f686c..4577737 100644
--- a/lib/System/Win32/Program.inc
+++ b/lib/System/Win32/Program.inc
@@ -303,7 +303,7 @@ Program::ExecuteAndWait(const Path& path,
   return status;
 }
 
-void
+Program::ProcessID
 Program::ExecuteNoWait(const Path& path,
                        const char** args,
                        const char** envp,
@@ -313,7 +313,7 @@ Program::ExecuteNoWait(const Path& path,
   if (!path.canExecute()) {
     if (ErrMsg)
       *ErrMsg = "program not executable";
-    return;
+    return 0;
   }
 
   // Windows wants a command line, not an array of args, to pass to the new
@@ -388,13 +388,13 @@ Program::ExecuteNoWait(const Path& path,
     si.hStdInput = RedirectIO(redirects[0], 0, ErrMsg);
     if (si.hStdInput == INVALID_HANDLE_VALUE) {
       MakeErrMsg(ErrMsg, "can't redirect stdin");
-      return;
+      return 0;
     }
     si.hStdOutput = RedirectIO(redirects[1], 1, ErrMsg);
     if (si.hStdOutput == INVALID_HANDLE_VALUE) {
       CloseHandle(si.hStdInput);
       MakeErrMsg(ErrMsg, "can't redirect stdout");
-      return;
+      return 0;
     }
     if (redirects[1] && redirects[2] && *(redirects[1]) == *(redirects[2])) {
       // If stdout and stderr should go to the same place, redirect stderr
@@ -409,7 +409,7 @@ Program::ExecuteNoWait(const Path& path,
         CloseHandle(si.hStdInput);
         CloseHandle(si.hStdOutput);
         MakeErrMsg(ErrMsg, "can't redirect stderr");
-        return;
+        return 0;
       }
     }
   }
@@ -435,7 +435,7 @@ Program::ExecuteNoWait(const Path& path,
     SetLastError(err);
     MakeErrMsg(ErrMsg, std::string("Couldn't execute program '") +
                path.toString() + "'");
-    return;
+    return 0;
   }
 
   // Make sure these get closed no matter what.
@@ -463,9 +463,11 @@ Program::ExecuteNoWait(const Path& path,
       MakeErrMsg(ErrMsg, std::string("Unable to set memory limit"));
       TerminateProcess(pi.hProcess, 1);
       WaitForSingleObject(pi.hProcess, INFINITE);
-      return;
+      return 0;
     }
   }
+
+  return pi.dwProcessId;
 }
 
 bool Program::ChangeStdinToBinary(){
-- 
1.6.3.3




More information about the llvm-dev mailing list