summaryrefslogtreecommitdiff
path: root/lib/Support/Program.cpp
diff options
context:
space:
mode:
authorTareq A. Siraj <tareq.a.siraj@intel.com>2013-10-01 14:28:18 +0000
committerTareq A. Siraj <tareq.a.siraj@intel.com>2013-10-01 14:28:18 +0000
commitc269c4f505a2dd7c3a88d12706257410ed6c7068 (patch)
treea7a0f3c199d81d62ec694957e26bcd1bcdedbfa9 /lib/Support/Program.cpp
parentb9dcca8265e9da01119c47e65f114c3adc972ba6 (diff)
downloadllvm-c269c4f505a2dd7c3a88d12706257410ed6c7068.tar.gz
llvm-c269c4f505a2dd7c3a88d12706257410ed6c7068.tar.bz2
llvm-c269c4f505a2dd7c3a88d12706257410ed6c7068.tar.xz
Add non-blocking Wait() for launched processes
- New ProcessInfo class to encapsulate information about child processes. - Generalized the Wait() to support non-blocking wait on child processes. - ExecuteNoWait() now returns a ProcessInfo object with information about the launched child. Users will be able to use this object to perform non-blocking wait. - ExecuteNoWait() now accepts an ExecutionFailed param that tells if execution failed or not. These changes will allow users to implement basic process parallel tools. Differential Revision: http://llvm-reviews.chandlerc.com/D1728 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191763 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support/Program.cpp')
-rw-r--r--lib/Support/Program.cpp36
1 files changed, 23 insertions, 13 deletions
diff --git a/lib/Support/Program.cpp b/lib/Support/Program.cpp
index 79f7e5fbb7..83f2ec4f0f 100644
--- a/lib/Support/Program.cpp
+++ b/lib/Support/Program.cpp
@@ -22,30 +22,40 @@ using namespace sys;
//=== independent code.
//===----------------------------------------------------------------------===//
-static bool Execute(void **Data, StringRef Program, const char **args,
+static bool Execute(ProcessInfo &PI, StringRef Program, const char **args,
const char **env, const StringRef **Redirects,
unsigned memoryLimit, std::string *ErrMsg);
-static int Wait(void *&Data, StringRef Program, unsigned secondsToWait,
- std::string *ErrMsg);
-
int sys::ExecuteAndWait(StringRef Program, const char **args, const char **envp,
const StringRef **redirects, unsigned secondsToWait,
unsigned memoryLimit, std::string *ErrMsg,
bool *ExecutionFailed) {
- void *Data = 0;
- if (Execute(&Data, Program, args, envp, redirects, memoryLimit, ErrMsg)) {
- if (ExecutionFailed) *ExecutionFailed = false;
- return Wait(Data, Program, secondsToWait, ErrMsg);
+ ProcessInfo PI;
+ if (Execute(PI, Program, args, envp, redirects, memoryLimit, ErrMsg)) {
+ if (ExecutionFailed)
+ *ExecutionFailed = false;
+ ProcessInfo Result = Wait(PI, secondsToWait, true, ErrMsg);
+ return Result.ReturnCode;
}
- if (ExecutionFailed) *ExecutionFailed = true;
+
+ if (ExecutionFailed)
+ *ExecutionFailed = true;
+
return -1;
}
-void sys::ExecuteNoWait(StringRef Program, const char **args, const char **envp,
- const StringRef **redirects, unsigned memoryLimit,
- std::string *ErrMsg) {
- Execute(/*Data*/ 0, Program, args, envp, redirects, memoryLimit, ErrMsg);
+ProcessInfo sys::ExecuteNoWait(StringRef Program, const char **args,
+ const char **envp, const StringRef **redirects,
+ unsigned memoryLimit, std::string *ErrMsg,
+ bool *ExecutionFailed) {
+ ProcessInfo PI;
+ if (ExecutionFailed)
+ *ExecutionFailed = false;
+ if (!Execute(PI, Program, args, envp, redirects, memoryLimit, ErrMsg))
+ if (ExecutionFailed)
+ *ExecutionFailed = true;
+
+ return PI;
}
// Include the platform-specific parts of this class.