* fixed forwarding a SIGINT and SIGHUP when using max-workers (#902)

git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@1982 152afb58-edef-0310-8abb-c4023f1b3aa9
This commit is contained in:
Jan Kneschke 2007-09-05 10:39:56 +00:00
parent b333dd7efa
commit e0629883a9
2 changed files with 70 additions and 10 deletions

1
NEWS
View File

@ -5,6 +5,7 @@ NEWS
- 1.4.18 -
* fixed compile error on IRIX 6.5.x on prctl() (#1333)
* fixed forwarding a SIGINT and SIGHUP when using max-workers (#902)
- 1.4.17 - 2007-08-29

View File

@ -68,6 +68,7 @@ static volatile sig_atomic_t srv_shutdown = 0;
static volatile sig_atomic_t graceful_shutdown = 0;
static volatile sig_atomic_t handle_sig_alarm = 1;
static volatile sig_atomic_t handle_sig_hup = 0;
static volatile sig_atomic_t forwarded_sig_hup = 0;
#if defined(HAVE_SIGACTION) && defined(SA_SIGINFO)
static volatile siginfo_t last_sigterm_info;
@ -94,8 +95,19 @@ static void sigaction_handler(int sig, siginfo_t *si, void *context) {
handle_sig_alarm = 1;
break;
case SIGHUP:
handle_sig_hup = 1;
memcpy(&last_sighup_info, si, sizeof(*si));
/**
* we send the SIGHUP to all procs in the process-group
* this includes ourself
*
* make sure we only send it once and don't create a
* infinite loop
*/
if (!forwarded_sig_hup) {
handle_sig_hup = 1;
memcpy(&last_sighup_info, si, sizeof(*si));
} else {
forwarded_sig_hup = 0;
}
break;
case SIGCHLD:
break;
@ -988,7 +1000,7 @@ int main (int argc, char **argv) {
num_childs = srv->srvconf.max_worker;
if (num_childs > 0) {
int child = 0;
while (!child && !srv_shutdown) {
while (!child && !srv_shutdown && !graceful_shutdown) {
if (num_childs > 0) {
switch (fork()) {
case -1:
@ -1003,14 +1015,61 @@ int main (int argc, char **argv) {
} else {
int status;
/* ignore EINTR */
if (-1 != wait(&status)) num_childs++;
if (-1 != wait(&status)) {
/**
* one of our workers went away
*/
num_childs++;
} else {
switch (errno) {
case EINTR:
/**
* if we receive a SIGHUP we have to close our logs ourself as we don't
* have the mainloop who can help us here
*/
if (handle_sig_hup) {
handle_sig_hup = 0;
log_error_cycle(srv);
/**
* forward to all procs in the process-group
*
* we also send it ourself
*/
if (!forwarded_sig_hup) {
forwarded_sig_hup = 1;
kill(0, SIGHUP);
}
}
break;
default:
break;
}
}
}
}
if (srv_shutdown) {
kill(0, SIGTERM);
/**
* for the parent this is the exit-point
*/
if (!child) {
/**
* kill all children too
*/
if (graceful_shutdown) {
kill(0, SIGINT);
} else if (srv_shutdown) {
kill(0, SIGTERM);
}
log_error_close(srv);
network_close(srv);
connections_free(srv);
plugins_free(srv);
server_free(srv);
return 0;
}
if (!child) return 0;
}
#endif
@ -1101,9 +1160,9 @@ int main (int argc, char **argv) {
#ifdef HAVE_SIGACTION
log_error_write(srv, __FILE__, __LINE__, "sdsd",
"logfiles cycled UID =",
last_sigterm_info.si_uid,
last_sighup_info.si_uid,
"PID =",
last_sigterm_info.si_pid);
last_sighup_info.si_pid);
#else
log_error_write(srv, __FILE__, __LINE__, "s",
"logfiles cycled");