Get rid of GetProcessId in Win32/Program.inc.

GetProcessId was introduced only in XP. As a bonus, this change makes Program
objects copyable, since Program is now basically a PID.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81826 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Mikhail Glushenkov
2009-09-15 03:39:45 +00:00
parent 3d76d11866
commit 6db0e3a981
3 changed files with 26 additions and 51 deletions
+17 -25
View File
@@ -25,21 +25,6 @@
namespace llvm {
using namespace sys;
Program::Program() : Data_(0) {}
Program::~Program() {
if (Data_) {
HANDLE hProcess = reinterpret_cast<HANDLE>(Data_);
CloseHandle(hProcess);
Data_ = 0;
}
}
unsigned Program::GetPid() const {
HANDLE hProcess = reinterpret_cast<HANDLE>(Data_);
return GetProcessId(hProcess);
}
// This function just uses the PATH environment variable to find the program.
Path
Program::FindProgramByName(const std::string& progName) {
@@ -137,11 +122,6 @@ Program::Execute(const Path& path,
const Path** redirects,
unsigned memoryLimit,
std::string* ErrMsg) {
if (Data_) {
HANDLE hProcess = reinterpret_cast<HANDLE>(Data_);
CloseHandle(Data_);
Data_ = 0;
}
if (!path.canExecute()) {
if (ErrMsg)
@@ -269,9 +249,10 @@ Program::Execute(const Path& path,
path.str() + "'");
return false;
}
Data_ = reinterpret_cast<void*>(pi.hProcess);
Pid_ = pi.dwProcessId;
// 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.
@@ -305,12 +286,17 @@ Program::Execute(const Path& path,
int
Program::Wait(unsigned secondsToWait,
std::string* ErrMsg) {
if (Data_ == 0) {
if (Pid_ == 0) {
MakeErrMsg(ErrMsg, "Process not started!");
return -1;
}
HANDLE hProcess = reinterpret_cast<HANDLE>(Data_);
HANDLE hOpen = OpenProcess(SYNCHRONIZE, FALSE, Pid_);
if (hOpen == NULL) {
MakeErrMsg(ErrMsg, "OpenProcess failed!");
return -1;
}
AutoHandle hProcess(hOpen);
// Wait for the process to terminate.
DWORD millisecondsToWait = INFINITE;
@@ -341,12 +327,18 @@ Program::Wait(unsigned secondsToWait,
bool
Program::Kill(std::string* ErrMsg) {
if (Data_ == 0) {
if (Pid_ == 0) {
MakeErrMsg(ErrMsg, "Process not started!");
return true;
}
HANDLE hProcess = reinterpret_cast<HANDLE>(Data_);
HANDLE hOpen = OpenProcess(PROCESS_TERMINATE, FALSE, Pid_);
if (hOpen == NULL) {
MakeErrMsg(ErrMsg, "OpenProcess failed!");
return true;
}
AutoHandle hProcess(hOpen);
if (TerminateProcess(hProcess, 1) == 0) {
MakeErrMsg(ErrMsg, "The process couldn't be killed!");
return true;