* pinfo.h (pinfo::operator ==): Add a way to check for _pinfo types.
* sigproc.cc (proc_subproc): Ensure that zombie is removed when SIGCHLD == SIG_IGN but still allow wait()ing threads to wake up.
This commit is contained in:
parent
1ed95be609
commit
1f8331ae8b
|
@ -1,3 +1,9 @@
|
|||
2003-12-17 Christopher Faylor <cgf@redhat.com>
|
||||
|
||||
* pinfo.h (pinfo::operator ==): Add a way to check for _pinfo types.
|
||||
* sigproc.cc (proc_subproc): Ensure that zombie is removed when SIGCHLD
|
||||
== SIG_IGN but still allow wait()ing threads to wake up.
|
||||
|
||||
2003-12-16 Christopher Faylor <cgf@redhat.com>
|
||||
|
||||
* exceptions.cc (set_signal_mask): Report on input argument rather than
|
||||
|
|
|
@ -792,7 +792,7 @@ signal_fixup_after_fork ()
|
|||
extern "C" void __stdcall
|
||||
set_sig_errno (int e)
|
||||
{
|
||||
set_errno (e);
|
||||
*_my_tls.errno_addr = e;
|
||||
_my_tls.saved_errno = e;
|
||||
// sigproc_printf ("errno %d", e);
|
||||
}
|
||||
|
|
|
@ -144,6 +144,7 @@ public:
|
|||
_pinfo *operator -> () const {return procinfo;}
|
||||
int operator == (pinfo *x) const {return x->procinfo == procinfo;}
|
||||
int operator == (pinfo &x) const {return x.procinfo == procinfo;}
|
||||
int operator == (_pinfo *x) const {return x == procinfo;}
|
||||
int operator == (void *x) const {return procinfo == x;}
|
||||
int operator == (int x) const {return (int) procinfo == (int) x;}
|
||||
int operator == (char *x) const {return (char *) procinfo == x;}
|
||||
|
|
|
@ -304,6 +304,8 @@ proc_subproc (DWORD what, DWORD val)
|
|||
_pinfo *child;
|
||||
int clearing;
|
||||
waitq *w;
|
||||
int thiszombie;
|
||||
_pinfo *zombie_proc = NULL;
|
||||
|
||||
#define wval ((waitq *) val)
|
||||
|
||||
|
@ -375,9 +377,8 @@ proc_subproc (DWORD what, DWORD val)
|
|||
sigproc_printf ("pid %d[%d] terminated, handle %p, nchildren %d, nzombies %d",
|
||||
pchildren[val]->pid, val, hchildren[val], nchildren, nzombies);
|
||||
|
||||
int thiszombie;
|
||||
thiszombie = nzombies;
|
||||
zombies[nzombies] = pchildren[val]; // Add to zombie array
|
||||
zombie_proc = zombies[nzombies] = pchildren[val]; // Add to zombie array
|
||||
zombies[nzombies++]->process_state = PID_ZOMBIE;// Walking dead
|
||||
|
||||
sigproc_printf ("zombifying [%d], pid %d, handle %p, nchildren %d",
|
||||
|
@ -391,11 +392,11 @@ proc_subproc (DWORD what, DWORD val)
|
|||
/* See if we should care about the this terminated process. If we've
|
||||
filled up our table or if we're ignoring SIGCHLD, then we immediately
|
||||
remove the process and move on. Otherwise, this process becomes a zombie
|
||||
which must be reaped by a wait() call. */
|
||||
if (nzombies >= NZOMBIES
|
||||
|| global_sigs[SIGCHLD].sa_handler == (void *) SIG_IGN)
|
||||
which must be reaped by a wait() call. FIXME: This is a very inelegant
|
||||
way to deal with this and could lead to process hangs. */
|
||||
if (nzombies >= NZOMBIES)
|
||||
{
|
||||
sigproc_printf ("automatically removing zombie %d", thiszombie);
|
||||
sigproc_printf ("zombie table overflow %d", thiszombie);
|
||||
remove_zombie (thiszombie);
|
||||
}
|
||||
|
||||
|
@ -477,6 +478,10 @@ proc_subproc (DWORD what, DWORD val)
|
|||
sigproc_printf ("finished processing terminated/stopped child");
|
||||
else
|
||||
{
|
||||
if (zombie_proc && zombies[thiszombie]
|
||||
&& zombies[thiszombie] == zombie_proc
|
||||
&& global_sigs[SIGCHLD].sa_handler == (void *) SIG_IGN)
|
||||
remove_zombie (thiszombie);
|
||||
waitq_head.next = NULL;
|
||||
sigproc_printf ("finished clearing");
|
||||
}
|
||||
|
|
|
@ -98,8 +98,8 @@ wait4 (int intpid, int *status, int options, struct rusage *r)
|
|||
|
||||
if (w->status == -1)
|
||||
{
|
||||
call_signal_handler_now ();
|
||||
set_sig_errno (EINTR);
|
||||
call_signal_handler_now ();
|
||||
sawsig = true;
|
||||
res = -1;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue