Don't call CloseHandle() twice on Windows (as it causes crashes, or unexpected behavior). This would happen with the following test case:

ProcessHandle handle = Process.launch(...);
handle.kill();
Then as handle gets out of scope, ~ProcessHandle would call CloseHandle() on an already closed handle.
This commit is contained in:
Patrice Tarabbia
2013-05-01 06:41:45 -04:00
parent e06fec0e24
commit c59f8865ac
14 changed files with 67 additions and 33 deletions

View File

@@ -237,7 +237,7 @@ public:
/// Waits for the process specified by handle to terminate
/// and returns the exit code of the process.
static void kill(const ProcessHandle& handle);
static void kill(ProcessHandle& handle);
/// Kills the process specified by handle.
///
/// This is preferable on Windows where process IDs

View File

@@ -84,7 +84,7 @@ public:
Pipe* outPipe,
Pipe* errPipe,
const EnvImpl& env);
static void killImpl(const ProcessHandleImpl& handle);
static void killImpl(ProcessHandleImpl& handle);
static void killImpl(PIDImpl pid);
static void requestTerminationImpl(PIDImpl pid);

View File

@@ -85,7 +85,7 @@ public:
Pipe* errPipe,
const EnvImpl& env);
static int waitImpl(PIDImpl pid);
static void killImpl(const ProcessHandleImpl& handle);
static void killImpl(ProcessHandleImpl& handle);
static void killImpl(PIDImpl pid);
static void requestTerminationImpl(PIDImpl pid);
};

View File

@@ -86,7 +86,7 @@ public:
Pipe* outPipe,
Pipe* errPipe,
const EnvImpl& env);
static void killImpl(const ProcessHandleImpl& handle);
static void killImpl(ProcessHandleImpl& handle);
static void killImpl(PIDImpl pid);
static void requestTerminationImpl(PIDImpl pid);
};

View File

@@ -62,7 +62,8 @@ public:
UInt32 id() const;
HANDLE process() const;
int wait() const;
void closeHandle();
private:
HANDLE _hProcess;
UInt32 _pid;
@@ -89,7 +90,7 @@ public:
Pipe* outPipe,
Pipe* errPipe,
const EnvImpl& env);
static void killImpl(const ProcessHandleImpl& handle);
static void killImpl(ProcessHandleImpl& handle);
static void killImpl(PIDImpl pid);
static void requestTerminationImpl(PIDImpl pid);
static std::string terminationEventName(PIDImpl pid);

View File

@@ -62,6 +62,7 @@ public:
UInt32 id() const;
HANDLE process() const;
int wait() const;
void closeHandle();
private:
HANDLE _hProcess;
@@ -89,7 +90,7 @@ public:
Pipe* outPipe,
Pipe* errPipe,
const EnvImpl& env);
static void killImpl(const ProcessHandleImpl& handle);
static void killImpl(ProcessHandleImpl& handle);
static void killImpl(PIDImpl pid);
static void requestTerminationImpl(PIDImpl pid);
static std::string terminationEventName(PIDImpl pid);

View File

@@ -62,7 +62,8 @@ public:
UInt32 id() const;
HANDLE process() const;
int wait() const;
void closeHandle();
private:
HANDLE _hProcess;
UInt32 _pid;
@@ -89,7 +90,7 @@ public:
Pipe* outPipe,
Pipe* errPipe,
const EnvImpl& env);
static void killImpl(const ProcessHandleImpl& handle);
static void killImpl(ProcessHandleImpl& handle);
static void killImpl(PIDImpl pid);
static void requestTerminationImpl(PIDImpl pid);
static std::string terminationEventName(PIDImpl pid);