Index: osiris/src/osirismd/md_schedule.c =================================================================== RCS file: /home/cvs/projects/osiris/src/osirismd/md_schedule.c,v retrieving revision 1.42 diff -u -r1.42 md_schedule.c --- osiris/src/osirismd/md_schedule.c 4 May 2004 15:52:38 -0000 1.42 +++ osiris/src/osirismd/md_schedule.c 5 May 2004 05:02:19 -0000 @@ -55,6 +55,12 @@ extern void parse_configuration_file(); +static int received_sigchld = 0; +static int received_sigint = 0; +static int received_sigterm = 0; +static int received_sigkill = 0; +static int received_sigpipe = 0; + THREAD_FUNCTION_TYPE md_scheduler_run( void *unused ) { @@ -299,7 +305,6 @@ sigset( SIGINT, scheduling_signal_handler ); sigset( SIGTERM, scheduling_signal_handler ); - sigset( SIGHUP, scheduling_signal_handler ); sigset( SIGCHLD, scheduling_signal_handler ); sigset( SIGPIPE, scheduling_signal_handler ); sigset( SIGKILL, scheduling_signal_handler ); @@ -312,10 +317,9 @@ /* windows doesn't know about these. */ #ifndef WIN32 - signal( SIGHUP, scheduling_signal_handler ); signal( SIGCHLD, scheduling_signal_handler ); - signal( SIGPIPE, scheduling_signal_handler ); signal( SIGKILL, scheduling_signal_handler ); + signal( SIGPIPE, scheduling_signal_handler ); #endif #endif /* HAVE_SIGSET */ @@ -332,49 +336,73 @@ void scheduling_signal_handler( int signal ) { - int status = 0; - switch( signal ) { case SIGINT: - - log_warning( LOG_ID_SCHEDULER_INFO, NULL, "received SIGINT" ); - - exit(-1); + received_sigint = 1; break; case SIGTERM: + received_sigterm = 1; + break; - log_warning( LOG_ID_SCHEDULER_INFO, NULL, "received SIGTERM" ); - - exit(-1); + case SIGKILL: + received_sigkill = 1; break; #ifndef WIN32 case SIGCHLD: - log_info( LOG_ID_GENERIC_INFO, NULL, "scheduler: SIGCHLD." ); - wait( &status ); + received_sigchld = 1; break; + + case SIGPIPE: + received_sigpipe = 1; + break; +#endif + default: + break; + } +} + +static void check_for_signals() +{ + int status = 0; + pid_t pid; - case SIGHUP: + if( received_sigint ) + { + log_warning( LOG_ID_SCHEDULER_INFO, NULL, "received SIGINT" ); + exit(-1); + } - log_warning( LOG_ID_SCHEDULER_INFO, NULL, "received SIGHUP" ); - break; + if( received_sigterm ) + { + log_warning( LOG_ID_SCHEDULER_INFO, NULL, "received SIGTERM" ); + exit(-1); + } - case SIGPIPE: + if( received_sigkill ) + { + log_warning( LOG_ID_SCHEDULER_INFO, NULL, "received SIGKILL" ); + exit(-1); + } - log_warning( LOG_ID_SCHEDULER_INFO, NULL, "received SIGPIPE" ); - break; + if( received_sigchld ) + { + received_sigchld = 0; - case SIGKILL: + while( ( pid = waitpid( -1, &status, WNOHANG ) ) > 0 || + ( ( pid < 0 ) && ( errno == EINTR ) ) ) + ; - log_warning( LOG_ID_SCHEDULER_INFO, NULL, "received SIGKILL" ); - exit(-1); - break; -#endif - default: - break; + log_info( LOG_ID_SCHEDULER_INFO, NULL, "scheduler child terminated." ); + } + + if( received_sigpipe ) + { + received_sigpipe = 0; + log_warning( LOG_ID_SCHEDULER_INFO, NULL, "received SIGPIPE" ); } } @@ -425,6 +453,7 @@ { if( errno == EINTR ) { + check_for_signals(); goto wait_for_data; } }