X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fdaemon.c;h=c72aa302f82ec74f0578e23370619f3d53b2e726;hb=185071b355f704ffe9072b3221eedbda78558dda;hp=82d1c9e5c3c5c9667bbb5853d1c205735d3a7e3b;hpb=573ca6773abadcc7380bf900a6f443119f2e8c01;p=yaz-moved-to-github.git diff --git a/src/daemon.c b/src/daemon.c index 82d1c9e..c72aa30 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -62,11 +62,31 @@ static void write_pidfile(int pid_fd) } } +int child_got_signal_from_us = 0; pid_t child_pid = 0; -static void kill_child_handler(int num) +static void normal_stop_handler(int num) { if (child_pid) + { + /* tell child to terminate . ensure keepalive stops running - + let wait(2) wait once - so we exit AFTER the child */ + child_got_signal_from_us = 1; kill(child_pid, num); + } +} + +static void graceful_stop_handler(int num) +{ + if (child_pid) + { + /* tell our child to stop listening and wait some in time + in the hope that it has stopped listening by then. Then + we exit - quite possibly the child is still running - serving + remaining requests */ + kill(child_pid, num); + sleep(2); + _exit(0); + } } static void keepalive(void (*work)(void *data), void *data) @@ -80,10 +100,10 @@ static void keepalive(void (*work)(void *data), void *data) /* keep signals in their original state and make sure that some signals to parent process also gets sent to the child.. */ - old_sighup = signal(SIGHUP, kill_child_handler); - old_sigterm = signal(SIGTERM, kill_child_handler); - old_sigusr1 = signal(SIGUSR1, kill_child_handler); - while (cont) + old_sighup = signal(SIGHUP, normal_stop_handler); + old_sigterm = signal(SIGTERM, normal_stop_handler); + old_sigusr1 = signal(SIGUSR1, graceful_stop_handler); + while (cont && !child_got_signal_from_us) { pid_t p = fork(); pid_t p1;