diff options
author | pixel <pixel> | 2008-07-02 10:05:16 +0000 |
---|---|---|
committer | pixel <pixel> | 2008-07-02 10:05:16 +0000 |
commit | 01ee09afd9e367a52a02b5ff29cf8d11fabd82ec (patch) | |
tree | 2366b4b0395636395a1915167fff81f8792ee259 | |
parent | 6d322b883faf5c9b5be51b24999cc6ea3b609741 (diff) |
Changing slightly the way children processes are handled - should fix defunc processes behavior.
-rw-r--r-- | lib/TaskMan.cc | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/lib/TaskMan.cc b/lib/TaskMan.cc index 48cead4..1752d8d 100644 --- a/lib/TaskMan.cc +++ b/lib/TaskMan.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* $Id: TaskMan.cc,v 1.55 2008-02-18 10:00:21 pixel Exp $ */ +/* $Id: TaskMan.cc,v 1.56 2008-07-02 10:05:16 pixel Exp $ */ #ifndef _WIN32 #include <signal.h> @@ -92,6 +92,7 @@ void TaskMan::CleanChildren() { } void TaskMan::SigChild() { +#if 0 int status; pid_t pid; @@ -101,7 +102,7 @@ void TaskMan::SigChild() { } else { WaitFor(pid, 0, status); } - +#endif // cerr << "Got SIGCHILD, pid = " << pid << " and status = " << status << endl; } @@ -324,9 +325,14 @@ void TaskMan::Init() throw (GeneralException) { signal(SIGHUP, taskman_sighup); signal(SIGUSR1, taskman_sigusr1); + sigset_t sigtempset; + sigemptyset(&sigchildset); - sigaddset(&sigchildset, SIGCHLD); - sigprocmask(SIG_BLOCK, &sigchildset, 0); + sigemptyset(&sigtempset); + sigprocmask(SIG_SETMASK, 0, &sigchildset); + sigprocmask(SIG_SETMASK, 0, &sigtempset); + sigaddset(&sigtempset, SIGCHLD); + sigprocmask(SIG_SETMASK, &sigtempset, 0); #endif inited = true; @@ -676,11 +682,14 @@ void TaskMan::MainLoop() throw (GeneralException) { bool timeout_condition = no_burst && !Zombies.size() && !got_sigchild && !got_yield; #ifdef _WIN32 - r = poll(ufsd, nfds, timeout_condition ? timeout: 0); + r = poll(ufsd, nfds, timeout_condition ? timeout : 0); #else - sigprocmask(SIG_UNBLOCK, &sigchildset, 0); - r = poll(ufsd, nfds, timeout_condition ? timeout: 0); - sigprocmask(SIG_BLOCK, &sigchildset, 0); + struct timespec ttimeout = { 0, 0 }; + if (timeout != -1) { + ttimeout.tv_sec = timeout / 1000; + ttimeout.tv_nsec = (timeout - (ttimeout.tv_sec * 1000)) * 1000000; + } + r = ppoll(ufsd, nfds, (timeout != -1) || !timeout_condition ? &ttimeout : 0, &sigchildset); #endif CleanChildren(); if (r < 0) { @@ -780,6 +789,8 @@ void TaskMan::MainLoop() throw (GeneralException) { for (std::vector<w4pr_t>::iterator p = w4pr.begin(); p != w4pr.end(); p++) { if (p->flag) { Task * t; + if (!p->T) + continue; if (p->T->IsStopped()) { continue; } |