From: Bill Kendall <wkendall@sgi.com>
To: xfs@oss.sgi.com
Subject: [PATCH 3/4] xfsdump: remove SIGCHLD handling
Date: Fri, 29 Jul 2011 15:40:10 -0500 [thread overview]
Message-ID: <1311972011-1446-4-git-send-email-wkendall@sgi.com> (raw)
In-Reply-To: <1311972011-1446-1-git-send-email-wkendall@sgi.com>
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@sgi.com>
---
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@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2011-07-29 20:41 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-29 20:40 [PATCH 0/4] xfsdump: convert to using the POSIX signal API Bill Kendall
2011-07-29 20:40 ` [PATCH 1/4] xfsdump: remove conditional OPENMASKED code Bill Kendall
2011-08-02 10:13 ` Christoph Hellwig
2011-08-02 14:07 ` Bill Kendall
2011-07-29 20:40 ` [PATCH 2/4] xfsdump: process EPIPE instead of catching SIGPIPE Bill Kendall
2011-08-02 10:15 ` Christoph Hellwig
2011-07-29 20:40 ` Bill Kendall [this message]
2011-08-02 10:22 ` [PATCH 3/4] xfsdump: remove SIGCHLD handling Christoph Hellwig
2011-08-02 14:13 ` Bill Kendall
2011-07-29 20:40 ` [PATCH 4/4] xfsdump: convert to the POSIX signal API Bill Kendall
2011-08-03 10:48 ` Christoph Hellwig
2011-08-03 10:56 ` Christoph Hellwig
2011-08-03 12:11 ` Bill Kendall
2011-08-03 12:39 ` Christoph Hellwig
2011-08-03 19:28 ` Bill Kendall
2011-08-04 7:53 ` Christoph Hellwig
2011-08-04 12:35 ` Bill Kendall
2011-08-04 12:37 ` Christoph Hellwig
2011-08-03 10:59 ` [PATCH 0/4] xfsdump: convert to using " Christoph Hellwig
2011-08-03 11:57 ` Bill Kendall
2011-08-03 12:02 ` Christoph Hellwig
2011-08-03 12:07 ` Bill Kendall
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1311972011-1446-4-git-send-email-wkendall@sgi.com \
--to=wkendall@sgi.com \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox