The multi-stream version of xfsdump for IRIX used sprocs for threading. When a "thread" exits with sprocs, a SIGCHLD is sent to the main thread just as if a regular child process exited. A future multi-stream version of xfsdump would use pthreads, so the SIGCHLD code is no longer needed. So: - No longer register for or handle SIGCHLD (SIGCLD). - Remove signal handling code for child processes. - Remove cldmgr_killall() as there are no children. Signed-off-by: Bill Kendall <wkendall@xxxxxxx> --- common/cldmgr.c | 28 ---------- common/cldmgr.h | 4 -- common/main.c | 155 ++++++++++--------------------------------------------- common/ring.c | 1 - 4 files changed, 28 insertions(+), 160 deletions(-) diff --git a/common/cldmgr.c b/common/cldmgr.c index 97507f3..3520c6e 100644 --- a/common/cldmgr.c +++ b/common/cldmgr.c @@ -59,16 +59,10 @@ static pid_t cldmgr_parentpid; bool_t cldmgr_init( void ) { - /* REFERENCED */ - intgen_t rval; - ( void )memset( ( void * )cld, 0, sizeof( cld )); cldmgr_stopflag = BOOL_FALSE; cldmgr_parentpid = getpid( ); - rval = atexit( cldmgr_killall ); - ASSERT( ! rval ); - return BOOL_TRUE; } @@ -125,27 +119,6 @@ cldmgr_stop( void ) cldmgr_stopflag = BOOL_TRUE; } -/* cldmgr_killall() - * - */ -void -cldmgr_killall( void ) -{ - cld_t *p = cld; - cld_t *ep = cld + sizeof( cld ) / sizeof( cld[ 0 ] ); - - signal( SIGCLD, SIG_IGN ); - for ( ; p < ep ; p++ ) { - if ( p->c_busy ) { - mlog( MLOG_NITTY | MLOG_PROC, - "sending SIGKILL to pid %d\n", - p->c_pid ); - kill( p->c_pid, SIGKILL ); - cldmgr_died( p->c_pid ); - } - } -} - void cldmgr_died( pid_t pid ) { @@ -247,7 +220,6 @@ cldmgr_entry( void *arg1 ) signal( SIGHUP, SIG_IGN ); signal( SIGINT, SIG_IGN ); signal( SIGQUIT, SIG_IGN ); - signal( SIGCLD, SIG_DFL ); alarm( 0 ); cldp->c_pid = pid; ok = qlock_thrdinit( ); diff --git a/common/cldmgr.h b/common/cldmgr.h index d80fe8b..bb3f612 100644 --- a/common/cldmgr.h +++ b/common/cldmgr.h @@ -40,10 +40,6 @@ extern bool_t cldmgr_create( int ( * entry )( void *arg1 ), */ extern void cldmgr_stop( void ); -/* cldmgr_killall - kills all children - */ -extern void cldmgr_killall( void ); - /* cldmgr_died - tells the child manager that the child died */ extern void cldmgr_died( pid_t pid ); diff --git a/common/main.c b/common/main.c index b5a9ccf..73c63bd 100644 --- a/common/main.c +++ b/common/main.c @@ -483,7 +483,6 @@ main( int argc, char *argv[] ) */ ok = drive_init1( argc, argv, miniroot ); if ( ! ok ) { - cldmgr_killall( ); return mlog_exit(EXIT_ERROR, RV_INIT); } @@ -566,8 +565,6 @@ main( int argc, char *argv[] ) alarm( 0 ); sigset( SIGALRM, sighandler ); sighold( SIGALRM ); - sigset( SIGCLD, sighandler ); - sighold( SIGCLD ); /* ignore SIGPIPE, instead handle EPIPE as part * of normal sys call error handling @@ -584,7 +581,6 @@ main( int argc, char *argv[] ) ok = content_init( argc, argv, vmsz / VMSZ_PER ); #endif /* RESTORE */ if ( ! ok ) { - cldmgr_killall( ); return mlog_exit(EXIT_ERROR, RV_INIT); } @@ -885,9 +881,7 @@ main( int argc, char *argv[] ) sigrelse( SIGHUP ); sigrelse( SIGTERM ); sigrelse( SIGQUIT ); - sigrelse( SIGALRM ); - ( void )sigpause( SIGCLD ); - sighold( SIGCLD ); + ( void )sigpause( SIGALRM ); sighold( SIGALRM ); sighold( SIGQUIT ); sighold( SIGTERM ); @@ -900,10 +894,6 @@ main( int argc, char *argv[] ) */ if ( coredump_requested ) { mlog( MLOG_DEBUG | MLOG_PROC, - "killing all remaining children\n" ); - cldmgr_killall( ); - sleep( 1 ); - mlog( MLOG_DEBUG | MLOG_PROC, "parent sending SIGQUIT to self (pid %d)\n", parentpid ); sigrelse( SIGQUIT ); @@ -1496,11 +1486,6 @@ mrh_sighandler( int signo ) static void sighandler( int signo ) { - /* get the pid and stream index - */ - pid_t pid = getpid( ); - intgen_t stix = stream_getix( pid ); - /* if in miniroot, don't do anything risky. just quit. */ if ( miniroot || pipeline ) { @@ -1520,117 +1505,34 @@ sighandler( int signo ) exit( rval ); } - /* if death of a child of a child, bury the child and return. - * probably rmt. - */ - if ( pid != parentpid && signo == SIGCLD ) { - intgen_t stat; - ( void )wait( &stat ); - ( void )sigset( signo, sighandler ); - return; - } - - /* if neither parent nor managed child nor slave, exit - */ - if ( pid != parentpid && stix == -1 ) { - exit( 0 ); - } - - /* parent signal handling - */ - if ( pid == parentpid ) { - pid_t cid; - intgen_t stat; - switch ( signo ) { - case SIGCLD: - /* bury the child and notify the child manager - * abstraction of its death, and record death stats - */ - cid = wait( &stat ); - stix = stream_getix( cid ); - cldmgr_died( cid ); - if ( WIFSIGNALED( stat ) || WEXITSTATUS( stat ) > 0 ) { - if ( prbcld_cnt == 0 ) { - if ( WIFSIGNALED( stat )) { - prbcld_pid = cid; - prbcld_xc = 0; - prbcld_signo = WTERMSIG( stat ); - } else if ( WEXITSTATUS( stat ) > 0 ) { - prbcld_pid = cid; - prbcld_xc = WEXITSTATUS( stat ); - prbcld_signo = 0; - } - } - prbcld_cnt++; - } - ( void )sigset( signo, sighandler ); - return; - case SIGHUP: - /* immediately disable further dialogs - */ - dlog_desist( ); - sighup_received = BOOL_TRUE; - return; - case SIGTERM: - /* immediately disable further dialogs - */ - dlog_desist( ); - sigterm_received = BOOL_TRUE; - return; - case SIGINT: - sigint_received = BOOL_TRUE; - return; - case SIGQUIT: - /* immediately disable further dialogs - */ - dlog_desist( ); - sigquit_received = BOOL_TRUE; - return; - case SIGALRM: - return; - default: - sigstray_received = signo; - return; - } - } - - /* managed child handling - */ - if ( stream_getix( pid ) != -1 ) { - switch ( signo ) { - case SIGHUP: - /* can get SIGHUP during dialog: just dismiss - */ - return; - case SIGTERM: - /* can get SIGTERM during dialog: just dismiss - */ - return; - case SIGINT: - /* can get SIGINT during dialog: just dismiss - */ - return; - case SIGQUIT: - /* can get SIGQUIT during dialog: just dismiss - */ - return; - case SIGALRM: - /* accept and do nothing about alarm signals - */ - return; - default: - /* should not be any other captured signals: - * request a core dump - */ - mlog_exit( EXIT_FAULT, RV_NONE ); - exit( EXIT_FAULT ); - return; - } + switch ( signo ) { + case SIGHUP: + /* immediately disable further dialogs + */ + dlog_desist( ); + sighup_received = BOOL_TRUE; + break; + case SIGTERM: + /* immediately disable further dialogs + */ + dlog_desist( ); + sigterm_received = BOOL_TRUE; + break; + case SIGINT: + sigint_received = BOOL_TRUE; + break; + case SIGQUIT: + /* immediately disable further dialogs + */ + dlog_desist( ); + sigquit_received = BOOL_TRUE; + break; + case SIGALRM: + break; + default: + sigstray_received = signo; + break; } - - /* if some other child, just exit - */ - exit( 0 ); } static int @@ -1647,7 +1549,6 @@ childmain( void *arg1 ) sigset( SIGINT, SIG_IGN ); sigset( SIGQUIT, SIG_IGN ); sigset( SIGALRM, SIG_IGN ); - sigset( SIGCLD, SIG_IGN ); /* Determine which stream I am. */ diff --git a/common/ring.c b/common/ring.c index b132ab9..237d884 100644 --- a/common/ring.c +++ b/common/ring.c @@ -413,7 +413,6 @@ ring_slave_entry( void *ringctxp ) sigset( SIGINT, SIG_IGN ); sigset( SIGQUIT, SIG_IGN ); sigset( SIGALRM, SIG_IGN ); - sigset( SIGCLD, SIG_IGN ); /* record slave pid to be used to kill slave */ -- 1.7.0.4 _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs