From 9f1d9fd1964d82f3e801efb71518144492cdf290 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 12 Jun 2013 20:58:35 +0000 Subject: Remove the program class. It was only used to implement ExecuteAndWait and ExecuteNoWait. Expose just those two functions and make Execute and Wait implementations details. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183864 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/Program.cpp | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) (limited to 'lib/Support/Program.cpp') diff --git a/lib/Support/Program.cpp b/lib/Support/Program.cpp index 201d5c0..ae7e291 100644 --- a/lib/Support/Program.cpp +++ b/lib/Support/Program.cpp @@ -22,33 +22,31 @@ using namespace sys; //=== independent code. //===----------------------------------------------------------------------===// -int -Program::ExecuteAndWait(const Path& path, - const char** args, - const char** envp, - const Path** redirects, - unsigned secondsToWait, - unsigned memoryLimit, - std::string* ErrMsg, +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); + +int sys::ExecuteAndWait(const Path &path, const char **args, const char **envp, + const Path **redirects, unsigned secondsToWait, + unsigned memoryLimit, std::string *ErrMsg, bool *ExecutionFailed) { - Program prg; - if (prg.Execute(path, args, envp, redirects, memoryLimit, ErrMsg)) { + void *Data; + if (Execute(Data, path, args, envp, redirects, memoryLimit, ErrMsg)) { if (ExecutionFailed) *ExecutionFailed = false; - return prg.Wait(path, secondsToWait, ErrMsg); + return Wait(Data, path, secondsToWait, ErrMsg); } if (ExecutionFailed) *ExecutionFailed = true; return -1; } -void -Program::ExecuteNoWait(const Path& path, - const char** args, - const char** envp, - const Path** redirects, - unsigned memoryLimit, - std::string* ErrMsg) { - Program prg; - prg.Execute(path, args, envp, redirects, memoryLimit, ErrMsg); +void sys::ExecuteNoWait(const Path &path, const char **args, const char **envp, + const Path **redirects, unsigned memoryLimit, + std::string *ErrMsg) { + void *Data; + Execute(Data, path, args, envp, redirects, memoryLimit, ErrMsg); } // Include the platform-specific parts of this class. -- cgit v1.1 From 0db5f0f07e6411fa25aefd464648ec8fc335a2d7 Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Thu, 13 Jun 2013 14:39:07 +0000 Subject: Zero-initializing variables; fixes a build breakage introduced in r183864. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183904 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/Program.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/Support/Program.cpp') diff --git a/lib/Support/Program.cpp b/lib/Support/Program.cpp index ae7e291..6e04a1c 100644 --- a/lib/Support/Program.cpp +++ b/lib/Support/Program.cpp @@ -33,7 +33,7 @@ int sys::ExecuteAndWait(const Path &path, const char **args, const char **envp, const Path **redirects, unsigned secondsToWait, unsigned memoryLimit, std::string *ErrMsg, bool *ExecutionFailed) { - void *Data; + void *Data = 0; if (Execute(Data, path, args, envp, redirects, memoryLimit, ErrMsg)) { if (ExecutionFailed) *ExecutionFailed = false; return Wait(Data, path, secondsToWait, ErrMsg); @@ -45,7 +45,7 @@ int sys::ExecuteAndWait(const Path &path, const char **args, const char **envp, void sys::ExecuteNoWait(const Path &path, const char **args, const char **envp, const Path **redirects, unsigned memoryLimit, std::string *ErrMsg) { - void *Data; + void *Data = 0; Execute(Data, path, args, envp, redirects, memoryLimit, ErrMsg); } -- cgit v1.1 From 62d124a1fa8b212bae1d331f027c9eec06a45199 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Thu, 13 Jun 2013 15:27:17 +0000 Subject: [Support] Fix handle and memory leak for processes that are not waited for Execute's Data parameter is now optional, so we won't allocate memory for it on Windows and we'll close the process handle. The Unix code should probably do something similar to avoid accumulation of zombie children that haven't been waited on. Tested on Linux and Windows. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183906 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/Program.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'lib/Support/Program.cpp') diff --git a/lib/Support/Program.cpp b/lib/Support/Program.cpp index 6e04a1c..b1a9b98 100644 --- a/lib/Support/Program.cpp +++ b/lib/Support/Program.cpp @@ -22,7 +22,7 @@ using namespace sys; //=== independent code. //===----------------------------------------------------------------------===// -static bool Execute(void *&Data, const Path &path, const char **args, +static bool Execute(void **Data, const Path &path, const char **args, const char **env, const sys::Path **redirects, unsigned memoryLimit, std::string *ErrMsg); @@ -34,7 +34,7 @@ int sys::ExecuteAndWait(const Path &path, const char **args, const char **envp, unsigned memoryLimit, std::string *ErrMsg, bool *ExecutionFailed) { void *Data = 0; - if (Execute(Data, path, args, envp, redirects, memoryLimit, ErrMsg)) { + if (Execute(&Data, path, args, envp, redirects, memoryLimit, ErrMsg)) { if (ExecutionFailed) *ExecutionFailed = false; return Wait(Data, path, secondsToWait, ErrMsg); } @@ -45,8 +45,7 @@ int sys::ExecuteAndWait(const Path &path, const char **args, const char **envp, void sys::ExecuteNoWait(const Path &path, const char **args, const char **envp, const Path **redirects, unsigned memoryLimit, std::string *ErrMsg) { - void *Data = 0; - Execute(Data, path, args, envp, redirects, memoryLimit, ErrMsg); + Execute(/*Data*/ 0, path, args, envp, redirects, memoryLimit, ErrMsg); } // Include the platform-specific parts of this class. -- cgit v1.1 From a29ece1693ff16ff991e184f6e073c9fb30fcb4b Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 13 Jun 2013 20:06:28 +0000 Subject: Add a version of sys::ExecuteAndWait that takes StringRefs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183934 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/Program.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'lib/Support/Program.cpp') diff --git a/lib/Support/Program.cpp b/lib/Support/Program.cpp index b1a9b98..1659726 100644 --- a/lib/Support/Program.cpp +++ b/lib/Support/Program.cpp @@ -29,6 +29,29 @@ static bool Execute(void **Data, const Path &path, const char **args, static int Wait(void *&Data, const Path &path, unsigned secondsToWait, std::string *ErrMsg); +int sys::ExecuteAndWait(StringRef path, const char **args, const char **env, + const StringRef **redirects, unsigned secondsToWait, + unsigned memoryLimit, std::string *ErrMsg, + bool *ExecutionFailed) { + Path P(path); + if (!redirects) + return ExecuteAndWait(P, args, env, 0, secondsToWait, memoryLimit, ErrMsg, + ExecutionFailed); + 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 ExecuteAndWait(P, args, env, IOP, secondsToWait, memoryLimit, ErrMsg, + ExecutionFailed); +} + int sys::ExecuteAndWait(const Path &path, const char **args, const char **envp, const Path **redirects, unsigned secondsToWait, unsigned memoryLimit, std::string *ErrMsg, -- cgit v1.1 From 675e0ac0bfd6fb78423d9fbee9f50c1dec62c111 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 13 Jun 2013 20:25:38 +0000 Subject: Avoid using PathV1.h in Program.h. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183940 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/Program.cpp | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) (limited to 'lib/Support/Program.cpp') diff --git a/lib/Support/Program.cpp b/lib/Support/Program.cpp index 1659726..52208b0 100644 --- a/lib/Support/Program.cpp +++ b/lib/Support/Program.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/Program.h" +#include "llvm/Support/PathV1.h" #include "llvm/Config/config.h" #include "llvm/Support/system_error.h" using namespace llvm; @@ -29,46 +30,50 @@ static bool Execute(void **Data, const Path &path, const char **args, static int Wait(void *&Data, const Path &path, unsigned secondsToWait, std::string *ErrMsg); -int sys::ExecuteAndWait(StringRef path, const char **args, const char **env, - const StringRef **redirects, unsigned secondsToWait, - unsigned memoryLimit, std::string *ErrMsg, - bool *ExecutionFailed) { - Path P(path); - if (!redirects) - return ExecuteAndWait(P, args, env, 0, secondsToWait, memoryLimit, ErrMsg, - ExecutionFailed); + +static bool Execute(void **Data, 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]; + if (Redirects[I]) { + IO[I] = *Redirects[I]; IOP[I] = &IO[I]; } else { IOP[I] = 0; - } + } } - return ExecuteAndWait(P, args, env, IOP, secondsToWait, memoryLimit, ErrMsg, - ExecutionFailed); + return Execute(Data, P, args, env, IOP, memoryLimit, ErrMsg); } -int sys::ExecuteAndWait(const Path &path, const char **args, const char **envp, - const Path **redirects, unsigned secondsToWait, +static int Wait(void *&Data, StringRef Program, unsigned secondsToWait, + std::string *ErrMsg) { + Path P(Program); + return Wait(Data, P, secondsToWait, 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, path, args, envp, redirects, memoryLimit, ErrMsg)) { + if (Execute(&Data, Program, args, envp, redirects, memoryLimit, ErrMsg)) { if (ExecutionFailed) *ExecutionFailed = false; - return Wait(Data, path, secondsToWait, ErrMsg); + return Wait(Data, Program, secondsToWait, ErrMsg); } if (ExecutionFailed) *ExecutionFailed = true; return -1; } -void sys::ExecuteNoWait(const Path &path, const char **args, const char **envp, - const Path **redirects, unsigned memoryLimit, +void sys::ExecuteNoWait(StringRef Program, const char **args, const char **envp, + const StringRef **redirects, unsigned memoryLimit, std::string *ErrMsg) { - Execute(/*Data*/ 0, path, args, envp, redirects, memoryLimit, ErrMsg); + Execute(/*Data*/ 0, Program, args, envp, redirects, memoryLimit, ErrMsg); } // Include the platform-specific parts of this class. -- cgit v1.1 From fcba9c56a25edc71e32a407dfd6191de6dba0ed7 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 14 Jun 2013 19:38:45 +0000 Subject: Replace use of PathV1.h in Program.cpp. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183996 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Support/Program.cpp | 32 ++------------------------------ 1 file changed, 2 insertions(+), 30 deletions(-) (limited to 'lib/Support/Program.cpp') diff --git a/lib/Support/Program.cpp b/lib/Support/Program.cpp index 52208b0..79f7e5f 100644 --- a/lib/Support/Program.cpp +++ b/lib/Support/Program.cpp @@ -12,7 +12,6 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/Program.h" -#include "llvm/Support/PathV1.h" #include "llvm/Config/config.h" #include "llvm/Support/system_error.h" using namespace llvm; @@ -23,39 +22,12 @@ 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, 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); -} + unsigned memoryLimit, std::string *ErrMsg); static int Wait(void *&Data, StringRef Program, unsigned secondsToWait, - std::string *ErrMsg) { - Path P(Program); - return Wait(Data, P, secondsToWait, ErrMsg); -} + std::string *ErrMsg); int sys::ExecuteAndWait(StringRef Program, const char **args, const char **envp, const StringRef **redirects, unsigned secondsToWait, -- cgit v1.1