* 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:
parent
b333dd7efa
commit
e0629883a9
1
NEWS
1
NEWS
|
@ -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
|
||||
|
|
79
src/server.c
79
src/server.c
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue