2
0
mirror of https://github.com/xcat2/xNBA.git synced 2024-12-14 15:21:32 +00:00

Actually, it's probably safer *not* to leave child processes hanging

around which still hold pointers to variables belonging to our parent...
This commit is contained in:
Michael Brown 2007-01-19 14:20:41 +00:00
parent b6194b8cb9
commit d6909f65f0

View File

@ -106,18 +106,16 @@ static void resolv_sigchld ( struct async *async,
/* Reap the child */
async_wait ( async, &rc, 1 );
/* If this child succeeded, kill all the others and return.
* Killing the others means that this routine may be
* re-entered; this is safe provided that no child returns a
* success exit status when killed by SIGKILL.
/* If this child succeeded, kill all the others. They should
* immediately die (invoking resolv_sigchld() again, which
* won't do anything because the exit status is non-zero and
* the pending count won't reach zero until this instance
* completes).
*/
if ( rc == 0 ) {
if ( rc == 0 )
async_signal_children ( async, SIGKILL );
async_done ( async, 0 );
return;
}
/* If we have no children left, return failure */
/* When we have no children left, exit */
if ( --(resolution->pending) == 0 )
async_done ( async, rc );
}
@ -135,6 +133,7 @@ static void resolv_reap ( struct async *async ) {
static struct async_operations resolv_async_operations = {
.reap = resolv_reap,
.signal = {
[SIGKILL] = async_signal_children,
[SIGCHLD] = resolv_sigchld,
},
};