diff options
author | Jeff Cohen <jeffc@jolt-lang.org> | 2007-03-05 05:22:08 +0000 |
---|---|---|
committer | Jeff Cohen <jeffc@jolt-lang.org> | 2007-03-05 05:22:08 +0000 |
commit | a531d04b648d8ff45a95662a009f13d74845e4ee (patch) | |
tree | 299515ec36a6429310fb52c5434b144beb7ce0af /llvm/lib/System/Win32/Program.inc | |
parent | 50bf51e8acaf5f44633e50a4c23f8b2ba29fdf55 (diff) | |
download | bcm5719-llvm-a531d04b648d8ff45a95662a009f13d74845e4ee.tar.gz bcm5719-llvm-a531d04b648d8ff45a95662a009f13d74845e4ee.zip |
Implement memoryLimit on Windows.
llvm-svn: 34922
Diffstat (limited to 'llvm/lib/System/Win32/Program.inc')
-rw-r--r-- | llvm/lib/System/Win32/Program.inc | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/llvm/lib/System/Win32/Program.inc b/llvm/lib/System/Win32/Program.inc index 86e6d580634..d5cdf384bec 100644 --- a/llvm/lib/System/Win32/Program.inc +++ b/llvm/lib/System/Win32/Program.inc @@ -93,8 +93,8 @@ static HANDLE RedirectIO(const Path *path, int fd, std::string* ErrMsg) { if (h == INVALID_HANDLE_VALUE) { MakeErrMsg(ErrMsg, std::string(fname) + ": Can't open file for " + (fd ? "input: " : "output: ")); - return h; } + return h; } @@ -179,7 +179,7 @@ Program::ExecuteAndWait(const Path& path, 0, TRUE, DUPLICATE_SAME_ACCESS); } } - + PROCESS_INFORMATION pi; memset(&pi, 0, sizeof(pi)); @@ -204,6 +204,35 @@ Program::ExecuteAndWait(const Path& path, return -1; } + // Make sure these get closed no matter what. + AutoHandle hProcess(pi.hProcess); + AutoHandle hThread(pi.hThread); + + // Assign the process to a job if a memory limit is defined. + AutoHandle hJob(0); + if (memoryLimit != 0) { + hJob = CreateJobObject(0, 0); + bool success = false; + if (hJob != 0) { + JOBOBJECT_EXTENDED_LIMIT_INFORMATION jeli; + memset(&jeli, 0, sizeof(jeli)); + jeli.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_PROCESS_MEMORY; + jeli.ProcessMemoryLimit = memoryLimit * 1048576; + if (SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, + &jeli, sizeof(jeli))) { + if (AssignProcessToJobObject(hJob, pi.hProcess)) + success = true; + } + } + if (!success) { + SetLastError(GetLastError()); + MakeErrMsg(ErrMsg, std::string("Unable to set memory limit")); + TerminateProcess(pi.hProcess, 1); + WaitForSingleObject(pi.hProcess, INFINITE); + return -1; + } + } + // Wait for it to terminate. DWORD millisecondsToWait = INFINITE; if (secondsToWait > 0) @@ -223,10 +252,6 @@ Program::ExecuteAndWait(const Path& path, rc = GetExitCodeProcess(pi.hProcess, &status); err = GetLastError(); - // Done with the handles; go close them. - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - if (!rc) { SetLastError(err); MakeErrMsg(ErrMsg, std::string("Failed getting status for program '") + |