Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Don't call CloseHandle() twice on Windows (as it causes crashes, or unex... #166

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 6 additions & 1 deletion Foundation/include/Poco/Activity.h
Expand Up @@ -121,6 +121,11 @@ class Activity: public Runnable
void start()
/// Starts the activity by acquiring a
/// thread for it from the default thread pool.
{
start(ThreadPool::defaultPool());
}

void start(ThreadPool& pool)
{
FastMutex::ScopedLock lock(_mutex);

Expand All @@ -131,7 +136,7 @@ class Activity: public Runnable
_running = true;
try
{
ThreadPool::defaultPool().start(*this);
pool.start(*this);
}
catch (...)
{
Expand Down
2 changes: 1 addition & 1 deletion Foundation/include/Poco/Process.h
Expand Up @@ -237,7 +237,7 @@ class Foundation_API Process: public ProcessImpl
/// 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
Expand Down
2 changes: 1 addition & 1 deletion Foundation/include/Poco/Process_UNIX.h
Expand Up @@ -84,7 +84,7 @@ class Foundation_API ProcessImpl
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);

Expand Down
2 changes: 1 addition & 1 deletion Foundation/include/Poco/Process_VMS.h
Expand Up @@ -85,7 +85,7 @@ class ProcessImpl
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);
};
Expand Down
2 changes: 1 addition & 1 deletion Foundation/include/Poco/Process_VX.h
Expand Up @@ -86,7 +86,7 @@ class Foundation_API ProcessImpl
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);
};
Expand Down
5 changes: 3 additions & 2 deletions Foundation/include/Poco/Process_WIN32.h
Expand Up @@ -62,7 +62,8 @@ class Foundation_API ProcessHandleImpl: public RefCountedObject
UInt32 id() const;
HANDLE process() const;
int wait() const;

void closeHandle();

private:
HANDLE _hProcess;
UInt32 _pid;
Expand All @@ -89,7 +90,7 @@ class Foundation_API ProcessImpl
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);
Expand Down
3 changes: 2 additions & 1 deletion Foundation/include/Poco/Process_WIN32U.h
Expand Up @@ -62,6 +62,7 @@ class Foundation_API ProcessHandleImpl: public RefCountedObject
UInt32 id() const;
HANDLE process() const;
int wait() const;
void closeHandle();

private:
HANDLE _hProcess;
Expand Down Expand Up @@ -89,7 +90,7 @@ class Foundation_API ProcessImpl
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);
Expand Down
5 changes: 3 additions & 2 deletions Foundation/include/Poco/Process_WINCE.h
Expand Up @@ -62,7 +62,8 @@ class Foundation_API ProcessHandleImpl: public RefCountedObject
UInt32 id() const;
HANDLE process() const;
int wait() const;

void closeHandle();

private:
HANDLE _hProcess;
UInt32 _pid;
Expand All @@ -89,7 +90,7 @@ class Foundation_API ProcessImpl
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);
Expand Down
2 changes: 1 addition & 1 deletion Foundation/src/Process.cpp
Expand Up @@ -200,7 +200,7 @@ int Process::wait(const ProcessHandle& handle)
}


void Process::kill(const ProcessHandle& handle)
void Process::kill(ProcessHandle& handle)
{
killImpl(*handle._pImpl);
}
Expand Down
2 changes: 1 addition & 1 deletion Foundation/src/Process_UNIX.cpp
Expand Up @@ -218,7 +218,7 @@ ProcessHandleImpl* ProcessImpl::launchByForkExecImpl(const std::string& command,
}


void ProcessImpl::killImpl(const ProcessHandleImpl& handle)
void ProcessImpl::killImpl(ProcessHandleImpl& handle)
{
killImpl(handle.id());
}
Expand Down
2 changes: 1 addition & 1 deletion Foundation/src/Process_VMS.cpp
Expand Up @@ -137,7 +137,7 @@ ProcessHandleImpl* ProcessImpl::launchImpl(const std::string& command, const Arg
}


void ProcessImpl::killImpl(const ProcessHandleImpl& handle)
void ProcessImpl::killImpl(ProcessHandleImpl& handle)
{
killImpl(handle.id());
}
Expand Down
2 changes: 1 addition & 1 deletion Foundation/src/Process_VX.cpp
Expand Up @@ -89,7 +89,7 @@ ProcessHandleImpl* ProcessImpl::launchImpl(const std::string& command, const Arg
}


void ProcessImpl::killImpl(const ProcessHandleImpl& handle)
void ProcessImpl::killImpl(ProcessHandleImpl& handle)
{
throw Poco::NotImplementedException("Process::kill()");
}
Expand Down
24 changes: 17 additions & 7 deletions Foundation/src/Process_WIN32.cpp
Expand Up @@ -56,9 +56,17 @@ ProcessHandleImpl::ProcessHandleImpl(HANDLE hProcess, UInt32 pid):

ProcessHandleImpl::~ProcessHandleImpl()
{
CloseHandle(_hProcess);
closeHandle();
}

void ProcessHandleImpl::closeHandle()
{
if (_hProcess)
{
CloseHandle(_hProcess);
_hProcess = NULL;
}
}

UInt32 ProcessHandleImpl::id() const
{
Expand Down Expand Up @@ -228,17 +236,19 @@ ProcessHandleImpl* ProcessImpl::launchImpl(const std::string& command, const Arg
}


void ProcessImpl::killImpl(const ProcessHandleImpl& handle)
void ProcessImpl::killImpl(ProcessHandleImpl& handle)
{
if (TerminateProcess(handle.process(), 0) == 0)
if (handle.process())
{
CloseHandle(handle.process());
throw SystemException("cannot kill process");
if (TerminateProcess(handle.process(), 0) == 0)
{
handle.closeHandle();
throw SystemException("cannot kill process");
}
handle.closeHandle();
}
CloseHandle(handle.process());
}


void ProcessImpl::killImpl(PIDImpl pid)
{
HANDLE hProc = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
Expand Down
24 changes: 17 additions & 7 deletions Foundation/src/Process_WIN32U.cpp
Expand Up @@ -57,9 +57,17 @@ ProcessHandleImpl::ProcessHandleImpl(HANDLE hProcess, UInt32 pid):

ProcessHandleImpl::~ProcessHandleImpl()
{
CloseHandle(_hProcess);
closeHandle();
}

void ProcessHandleImpl::closeHandle()
{
if (_hProcess)
{
CloseHandle(_hProcess);
_hProcess = NULL;
}
}

UInt32 ProcessHandleImpl::id() const
{
Expand Down Expand Up @@ -234,17 +242,19 @@ ProcessHandleImpl* ProcessImpl::launchImpl(const std::string& command, const Arg
}


void ProcessImpl::killImpl(const ProcessHandleImpl& handle)
void ProcessImpl::killImpl(ProcessHandleImpl& handle)
{
if (TerminateProcess(handle.process(), 0) == 0)
if (handle.process())
{
CloseHandle(handle.process());
throw SystemException("cannot kill process");
if (TerminateProcess(handle.process(), 0) == 0)
{
handle.closeHandle();
throw SystemException("cannot kill process");
}
handle.closeHandle();
}
CloseHandle(handle.process());
}


void ProcessImpl::killImpl(PIDImpl pid)
{
HANDLE hProc = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
Expand Down
23 changes: 17 additions & 6 deletions Foundation/src/Process_WINCE.cpp
Expand Up @@ -57,9 +57,17 @@ ProcessHandleImpl::ProcessHandleImpl(HANDLE hProcess, UInt32 pid):

ProcessHandleImpl::~ProcessHandleImpl()
{
CloseHandle(_hProcess);
closeHandle();
}

void ProcessHandleImpl::closeHandle()
{
if (_hProcess)
{
CloseHandle(_hProcess);
_hProcess = NULL;
}
}

UInt32 ProcessHandleImpl::id() const
{
Expand Down Expand Up @@ -158,14 +166,17 @@ ProcessHandleImpl* ProcessImpl::launchImpl(const std::string& command, const Arg
}


void ProcessImpl::killImpl(const ProcessHandleImpl& handle)
void ProcessImpl::killImpl(ProcessHandleImpl& handle)
{
if (TerminateProcess(handle.process(), 0) == 0)
if (handle.process())
{
CloseHandle(handle.process());
throw SystemException("cannot kill process");
if (TerminateProcess(handle.process(), 0) == 0)
{
handle.closeHandle();
throw SystemException("cannot kill process");
}
handle.closeHandle();
}
CloseHandle(handle.process());
}


Expand Down