X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FSupport%2FProgram.cpp;h=b84b82b1f10bae8e344cbe6e5679f882dddbec5f;hb=c33fe1b2961169cb0e8ffd92dc67a9328af348f3;hp=52208b047d1deb6960e994f1c5f8926a7003643f;hpb=675e0ac0bfd6fb78423d9fbee9f50c1dec62c111;p=oota-llvm.git diff --git a/lib/Support/Program.cpp b/lib/Support/Program.cpp index 52208b047d1..b84b82b1f10 100644 --- a/lib/Support/Program.cpp +++ b/lib/Support/Program.cpp @@ -7,14 +7,13 @@ // //===----------------------------------------------------------------------===// // -// This header file implements the operating system Program concept. +// This file implements the operating system Program concept. // //===----------------------------------------------------------------------===// #include "llvm/Support/Program.h" -#include "llvm/Support/PathV1.h" #include "llvm/Config/config.h" -#include "llvm/Support/system_error.h" +#include using namespace llvm; using namespace sys; @@ -23,57 +22,41 @@ using namespace sys; //=== independent code. //===----------------------------------------------------------------------===// -static bool Execute(void **Data, const Path &path, const char **args, - const char **env, const sys::Path **redirects, - unsigned memoryLimit, std::string *ErrMsg); - -static int Wait(void *&Data, const Path &path, unsigned secondsToWait, - std::string *ErrMsg); - - -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) { - Path P(Program); - if (!Redirects) - return Execute(Data, P, args, env, 0, memoryLimit, ErrMsg); - Path IO[3]; - const Path *IOP[3]; - for (int I = 0; I < 3; ++I) { - if (Redirects[I]) { - IO[I] = *Redirects[I]; - IOP[I] = &IO[I]; - } else { - IOP[I] = 0; - } - } - - return Execute(Data, P, args, env, IOP, memoryLimit, ErrMsg); -} - -static int Wait(void *&Data, StringRef Program, unsigned secondsToWait, - std::string *ErrMsg) { - Path P(Program); - return Wait(Data, P, secondsToWait, ErrMsg); -} + unsigned memoryLimit, 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, /*WaitUntilTerminates=*/secondsToWait == 0, 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.