The following reply was made to PR mod_jserv/5755; it has been noted by GNATS.
From: Vladislav Malyshkin <[EMAIL PROTECTED]> To: Ed Korthof <[EMAIL PROTECTED]>, [EMAIL PROTECTED] Cc: Subject: Re: mod_jserv/5755: mod_jserv and httpd -HUP restarting problem Date: Tue, 15 Feb 2000 10:23:39 -0500 This is a new patch which also fixes a problem with races when a signal is delivered during processing a signal. (It leaded to error messages in log that JSern is not responding) Vladislav diff -u jserv_wrapper_unix.c.orig jserv_wrapper_unix.c --- jserv_wrapper_unix.c.orig Mon Feb 14 16:16:11 2000 +++ jserv_wrapper_unix.c Tue Feb 15 10:15:27 2000 @@ -98,10 +98,12 @@ /* this is also used from the loop to kill JVM */ void kill_hung_jvm(int signum) { int counter = 0; + const int jvm_pid_local=jvm_pid; /* Is jvm is really started? If not - do nothing */ - if( jvm_pid == 0) + if( jvm_pid_local == 0) return; + jvm_pid=0; if( signum == 0) { jserv_error(JSERV_LOG_INFO, wrapper_data->config, @@ -112,18 +114,17 @@ } /* IF JVM is not responding to connections, we can't do * * anything but kill it. */ - kill(jvm_pid, SIGTERM); + kill(jvm_pid_local, SIGTERM); /* give the VM as long as five seconds to die gracefully */ while (counter++ < 5) { - if (waitpid(jvm_pid, NULL, WNOHANG) > 0) + if (waitpid(jvm_pid_local, NULL, WNOHANG) > 0) break; sleep(1); } - if( waitpid(jvm_pid,NULL,WNOHANG)==0 ) { - kill(jvm_pid, SIGKILL); + if( waitpid(jvm_pid_local,NULL,WNOHANG)==0 ) { + kill(jvm_pid_local, SIGKILL); } - jvm_pid=0; } @@ -362,6 +363,12 @@ jvm_pid = 0; } + /* If we get a TERM signal, shut down the JVM nicely, then exit. + */ + signal(SIGTERM, wrapper_shutdown); + signal(SIGHUP, wrapper_shutdown); + + /* install SIGALARM handler to implement a timeout in communication */ /* NOTE: As it is installed in each loop, it should work with SYSV signal()*/ @@ -477,30 +484,32 @@ /* ========================================================================= */ /* This does the actual cleanup */ int wrapper_shutdown_core(wrapper_config *cfg) { - if (jvm_pid != 0) { + const int jvm_pid_local=jvm_pid; + if (jvm_pid_local != 0) { int counter = 0; + jvm_pid=0; jserv_error(JSERV_LOG_INFO,wrapper_data->config, "wrapper: Terminating JServ (PID=%d, VM PID=%d)", - getpid(), jvm_pid); + getpid(), jvm_pid_local); /* Send shutdown function */ jserv_protocol_function(cfg->config->protocol,cfg->config, JSERV_SHUTDOWN,NULL); /* Wait for child to go down */ - while (waitpid(jvm_pid,NULL,WNOHANG)==0) { + while (waitpid(jvm_pid_local,NULL,WNOHANG)==0) { /* give it a little while to shut down gracefully. Then kill it. */ if (++counter > cfg->config->vmtimeout) { jserv_error(JSERV_LOG_EMERG, wrapper_data->config, "wrapper: JServ (%d) didn't die nicely, killing it", - jvm_pid); - kill(jvm_pid, SIGTERM); /* give the process a chance to die */ + jvm_pid_local); + kill(jvm_pid_local, SIGTERM); /* give the process a chance to die */ counter = 0; while (counter++ < 3) { - if (waitpid(jvm_pid, NULL, WNOHANG) > 0) + if (waitpid(jvm_pid_local, NULL, WNOHANG) > 0) return 0; sleep(1); } - if( waitpid(jvm_pid,NULL,WNOHANG)==0 ) { - kill(jvm_pid, SIGKILL); + if( waitpid(jvm_pid_local,NULL,WNOHANG)==0 ) { + kill(jvm_pid_local, SIGKILL); } } sleep(1);