diff --git a/Foundation/include/Poco/Activity.h b/Foundation/include/Poco/Activity.h index 66c80d9ae..29c4d4c32 100644 --- a/Foundation/include/Poco/Activity.h +++ b/Foundation/include/Poco/Activity.h @@ -121,6 +121,11 @@ public: 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); @@ -131,7 +136,7 @@ public: _running = true; try { - ThreadPool::defaultPool().start(*this); + pool.start(*this); } catch (...) { diff --git a/Foundation/include/Poco/Process.h b/Foundation/include/Poco/Process.h index ead8a619e..2a82130fa 100644 --- a/Foundation/include/Poco/Process.h +++ b/Foundation/include/Poco/Process.h @@ -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 diff --git a/Foundation/include/Poco/Process_UNIX.h b/Foundation/include/Poco/Process_UNIX.h index e976773b8..ecfa74f55 100644 --- a/Foundation/include/Poco/Process_UNIX.h +++ b/Foundation/include/Poco/Process_UNIX.h @@ -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); diff --git a/Foundation/include/Poco/Process_VMS.h b/Foundation/include/Poco/Process_VMS.h index 70ed3583d..668d67d56 100644 --- a/Foundation/include/Poco/Process_VMS.h +++ b/Foundation/include/Poco/Process_VMS.h @@ -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); }; diff --git a/Foundation/include/Poco/Process_VX.h b/Foundation/include/Poco/Process_VX.h index 9bc7ba248..767d0535a 100644 --- a/Foundation/include/Poco/Process_VX.h +++ b/Foundation/include/Poco/Process_VX.h @@ -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); }; diff --git a/Foundation/include/Poco/Process_WIN32.h b/Foundation/include/Poco/Process_WIN32.h index 3e9bc4037..fdc7ab3c8 100644 --- a/Foundation/include/Poco/Process_WIN32.h +++ b/Foundation/include/Poco/Process_WIN32.h @@ -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); diff --git a/Foundation/include/Poco/Process_WIN32U.h b/Foundation/include/Poco/Process_WIN32U.h index 5ba4164ea..0396fa632 100644 --- a/Foundation/include/Poco/Process_WIN32U.h +++ b/Foundation/include/Poco/Process_WIN32U.h @@ -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); diff --git a/Foundation/include/Poco/Process_WINCE.h b/Foundation/include/Poco/Process_WINCE.h index a25aca804..868cc4d85 100644 --- a/Foundation/include/Poco/Process_WINCE.h +++ b/Foundation/include/Poco/Process_WINCE.h @@ -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); diff --git a/Foundation/src/Process.cpp b/Foundation/src/Process.cpp index eb90f6748..378841661 100644 --- a/Foundation/src/Process.cpp +++ b/Foundation/src/Process.cpp @@ -200,7 +200,7 @@ int Process::wait(const ProcessHandle& handle) } -void Process::kill(const ProcessHandle& handle) +void Process::kill(ProcessHandle& handle) { killImpl(*handle._pImpl); } diff --git a/Foundation/src/Process_UNIX.cpp b/Foundation/src/Process_UNIX.cpp index d64885743..ff2adec0a 100644 --- a/Foundation/src/Process_UNIX.cpp +++ b/Foundation/src/Process_UNIX.cpp @@ -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()); } diff --git a/Foundation/src/Process_VMS.cpp b/Foundation/src/Process_VMS.cpp index 7508a286d..0fcc3e759 100644 --- a/Foundation/src/Process_VMS.cpp +++ b/Foundation/src/Process_VMS.cpp @@ -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()); } diff --git a/Foundation/src/Process_VX.cpp b/Foundation/src/Process_VX.cpp index 1304267ea..caad13cf2 100644 --- a/Foundation/src/Process_VX.cpp +++ b/Foundation/src/Process_VX.cpp @@ -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()"); } diff --git a/Foundation/src/Process_WIN32.cpp b/Foundation/src/Process_WIN32.cpp index a338f3a88..96e936fe6 100644 --- a/Foundation/src/Process_WIN32.cpp +++ b/Foundation/src/Process_WIN32.cpp @@ -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 { @@ -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); diff --git a/Foundation/src/Process_WIN32U.cpp b/Foundation/src/Process_WIN32U.cpp index 3fd54504b..869c995fc 100644 --- a/Foundation/src/Process_WIN32U.cpp +++ b/Foundation/src/Process_WIN32U.cpp @@ -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 { @@ -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); diff --git a/Foundation/src/Process_WINCE.cpp b/Foundation/src/Process_WINCE.cpp index 366fc6ed1..bf7d91cb8 100644 --- a/Foundation/src/Process_WINCE.cpp +++ b/Foundation/src/Process_WINCE.cpp @@ -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 { @@ -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()); }