40 #include "blocxx/BLOCXX_config.h"
63 #include "blocxx/WinProcessUtils.hpp"
74 #ifdef BLOCXX_HAVE_UNISTD_H
78 #if defined(sigemptyset)
83 namespace BLOCXX_NAMESPACE
103 : m_status_available(pid > 0),
109 : m_status_available(static_cast<bool>(rep1)),
173 return !m_status_available;
178 return m_status_available && (WIFEXITED(
m_status) || WIFSIGNALED(
m_status));
183 return m_status_available && WIFEXITED(
m_status);
198 return m_status_available && WIFSIGNALED(
m_status);
208 return m_status_available && WIFSTOPPED(
m_status);
220 rep1 =
static_cast<int>(m_status_available);
226 return exitTerminated() && exitStatus() == 0;
239 else if (terminated())
241 if (exitTerminated())
243 return Format(
"exited with status %1",
String(exitStatus()));
245 else if (signalTerminated())
270 return ::kill(pid, sig) == 0 ? 0 : errno;
274 virtual Process::Status pollStatus(
ProcId pid)
285 struct ZombieReaperPoolCreator
287 static ThreadPool* create(
int dummy)
294 class ZombieReaper :
public Runnable
307 while (!status.terminated())
329 :
m_impl(new ChildProcessImpl())
353 :
m_impl(new ChildProcessImpl())
504 if (!killProcess(killTimeout, terminationSelectionFlag))
518 if (!
killWait(sigkillTimeout, SIGKILL,
"SIGKILL", terminationSelectionFlag))
532 float const mult = 1.20;
533 float const max_period = 5000.0;
534 float period = 100.0;
539 period = (std::min)(max_period, period * mult);
554 DWORD rc1 = WaitForSingleObject(pid, 0);
555 if(rc1 == WAIT_FAILED)
562 BOOL rc = GetExitCodeProcess(pid, &exitCode);
571 return Process::Status(pid, exitCode);
576 bool Process::terminateByMessage(
const Timeout& waitTime)
578 DWORD bsmApp = BSM_APPLICATIONS;
580 BOOL bSucceed = BroadcastSystemMessage(BSF_IGNORECURRENTTASK, &bsmApp, termMsg, NULL, NULL);
599 bool Process::killProcess(
const Timeout& waitTime, ETerminationSelectionFlag terminationSelectionFlag)
601 DWORD result = ERROR_SUCCESS;
603 DWORD pId = WinUtils::getProcessIdNT(
m_pid);
606 result = WinUtils::killProcessGroup(pId);
610 result = WinUtils::killProcess(pId);
613 if (result != ERROR_SUCCESS)
632 return GetCurrentProcess();
645 wpid = ::waitpid(pid, &status, WNOHANG | WUNTRACED);
647 }
while (wpid < 0 && errno == EINTR);
673 Format fmt(
"Failed sending %1 to process %2.", signame,
m_pid);
674 char const * msg = fmt.
c_str();