* 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>
|
2003-12-16 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
* exceptions.cc (set_signal_mask): Report on input argument rather than
|
* exceptions.cc (set_signal_mask): Report on input argument rather than
|
||||||
|
|
|
@ -792,7 +792,7 @@ signal_fixup_after_fork ()
|
||||||
extern "C" void __stdcall
|
extern "C" void __stdcall
|
||||||
set_sig_errno (int e)
|
set_sig_errno (int e)
|
||||||
{
|
{
|
||||||
set_errno (e);
|
*_my_tls.errno_addr = e;
|
||||||
_my_tls.saved_errno = e;
|
_my_tls.saved_errno = e;
|
||||||
// sigproc_printf ("errno %d", e);
|
// sigproc_printf ("errno %d", e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -144,6 +144,7 @@ public:
|
||||||
_pinfo *operator -> () const {return procinfo;}
|
_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 == 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 == (void *x) const {return procinfo == x;}
|
||||||
int operator == (int x) const {return (int) procinfo == (int) x;}
|
int operator == (int x) const {return (int) procinfo == (int) x;}
|
||||||
int operator == (char *x) const {return (char *) procinfo == x;}
|
int operator == (char *x) const {return (char *) procinfo == x;}
|
||||||
|
|
|
@ -304,6 +304,8 @@ proc_subproc (DWORD what, DWORD val)
|
||||||
_pinfo *child;
|
_pinfo *child;
|
||||||
int clearing;
|
int clearing;
|
||||||
waitq *w;
|
waitq *w;
|
||||||
|
int thiszombie;
|
||||||
|
_pinfo *zombie_proc = NULL;
|
||||||
|
|
||||||
#define wval ((waitq *) val)
|
#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",
|
sigproc_printf ("pid %d[%d] terminated, handle %p, nchildren %d, nzombies %d",
|
||||||
pchildren[val]->pid, val, hchildren[val], nchildren, nzombies);
|
pchildren[val]->pid, val, hchildren[val], nchildren, nzombies);
|
||||||
|
|
||||||
int thiszombie;
|
|
||||||
thiszombie = nzombies;
|
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
|
zombies[nzombies++]->process_state = PID_ZOMBIE;// Walking dead
|
||||||
|
|
||||||
sigproc_printf ("zombifying [%d], pid %d, handle %p, nchildren %d",
|
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
|
/* 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
|
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
|
remove the process and move on. Otherwise, this process becomes a zombie
|
||||||
which must be reaped by a wait() call. */
|
which must be reaped by a wait() call. FIXME: This is a very inelegant
|
||||||
if (nzombies >= NZOMBIES
|
way to deal with this and could lead to process hangs. */
|
||||||
|| global_sigs[SIGCHLD].sa_handler == (void *) SIG_IGN)
|
if (nzombies >= NZOMBIES)
|
||||||
{
|
{
|
||||||
sigproc_printf ("automatically removing zombie %d", thiszombie);
|
sigproc_printf ("zombie table overflow %d", thiszombie);
|
||||||
remove_zombie (thiszombie);
|
remove_zombie (thiszombie);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -477,6 +478,10 @@ proc_subproc (DWORD what, DWORD val)
|
||||||
sigproc_printf ("finished processing terminated/stopped child");
|
sigproc_printf ("finished processing terminated/stopped child");
|
||||||
else
|
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;
|
waitq_head.next = NULL;
|
||||||
sigproc_printf ("finished clearing");
|
sigproc_printf ("finished clearing");
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,8 +98,8 @@ wait4 (int intpid, int *status, int options, struct rusage *r)
|
||||||
|
|
||||||
if (w->status == -1)
|
if (w->status == -1)
|
||||||
{
|
{
|
||||||
call_signal_handler_now ();
|
|
||||||
set_sig_errno (EINTR);
|
set_sig_errno (EINTR);
|
||||||
|
call_signal_handler_now ();
|
||||||
sawsig = true;
|
sawsig = true;
|
||||||
res = -1;
|
res = -1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue