X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fdaemon.c;h=c72aa302f82ec74f0578e23370619f3d53b2e726;hb=185071b355f704ffe9072b3221eedbda78558dda;hp=5d7979d9127d2533a4ee81c0e7df9feac0dbc75a;hpb=ab4fa4869bf147f316b418e6c1a24807d82ed5f6;p=yaz-moved-to-github.git diff --git a/src/daemon.c b/src/daemon.c index 5d7979d..c72aa30 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -62,12 +62,29 @@ 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); } } @@ -83,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;