X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fdaemon.c;h=3a8bb428ac287e5e5b17ba60fa73e022feadd5e6;hp=1bfc6e095c51388628e3b5f2087ccbf4030010d5;hb=f16fe49dbe30ef1e846958a09c0d2924a24c9be5;hpb=5242cb5a8634bfa38b9333ff7f903e718ac6e292 diff --git a/src/daemon.c b/src/daemon.c index 1bfc6e0..3a8bb42 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2012 Index Data + * Copyright (C) Index Data * See the file LICENSE for details. */ @@ -74,21 +74,24 @@ static void normal_stop_handler(int num) } } -static void immediate_exit_handler(int num) +static void sigusr2_handler(int num) { - _exit(0); } static pid_t keepalive_pid = 0; static void keepalive(void (*work)(void *data), void *data) { + int no_sigill = 0; + int no_sigabrt = 0; + int no_sigsegv = 0; + int no_sigbus = 0; int run = 1; int cont = 1; void (*old_sighup)(int); void (*old_sigterm)(int); void (*old_sigusr1)(int); - void (*old_sigusr2)(int); + struct sigaction sa2, sa1; keepalive_pid = getpid(); @@ -97,7 +100,12 @@ static void keepalive(void (*work)(void *data), void *data) old_sighup = signal(SIGHUP, normal_stop_handler); old_sigterm = signal(SIGTERM, normal_stop_handler); old_sigusr1 = signal(SIGUSR1, normal_stop_handler); - old_sigusr2 = signal(SIGUSR2, immediate_exit_handler); + + sigemptyset(&sa2.sa_mask); + sa2.sa_handler = sigusr2_handler; + sa2.sa_flags = 0; + sigaction(SIGUSR2, &sa2, &sa1); + while (cont && !child_got_signal_from_us) { pid_t p = fork(); @@ -114,7 +122,7 @@ static void keepalive(void (*work)(void *data), void *data) signal(SIGHUP, old_sighup); /* restore */ signal(SIGTERM, old_sigterm);/* restore */ signal(SIGUSR1, old_sigusr1);/* restore */ - signal(SIGUSR2, old_sigusr2);/* restore */ + sigaction(SIGUSR2, &sa1, NULL); work(data); exit(0); @@ -123,17 +131,25 @@ static void keepalive(void (*work)(void *data), void *data) /* enable signalling in kill_child_handler */ child_pid = p; - p1 = wait(&status); + p1 = waitpid(p, &status, 0); /* disable signalling in kill_child_handler */ child_pid = 0; + if (p1 == (pid_t)(-1)) + { + if (errno != EINTR) + { + yaz_log(YLOG_FATAL|YLOG_ERRNO, "waitpid"); + break; + } + continue; + } if (p1 != p) { yaz_log(YLOG_FATAL, "p1=%d != p=%d", p1, p); - exit(1); + break; } - if (WIFSIGNALED(status)) { /* keep the child alive in case of errors, but _log_ */ @@ -142,18 +158,22 @@ static void keepalive(void (*work)(void *data), void *data) case SIGILL: yaz_log(YLOG_WARN, "Received SIGILL from child %ld", (long) p); cont = 1; + no_sigill++; break; case SIGABRT: yaz_log(YLOG_WARN, "Received SIGABRT from child %ld", (long) p); cont = 1; + no_sigabrt++; break ; case SIGSEGV: yaz_log(YLOG_WARN, "Received SIGSEGV from child %ld", (long) p); cont = 1; + ++no_sigsegv; break; case SIGBUS: yaz_log(YLOG_WARN, "Received SIGBUS from child %ld", (long) p); cont = 1; + no_sigbus++; break; case SIGTERM: yaz_log(YLOG_LOG, "Received SIGTERM from child %ld", @@ -179,6 +199,15 @@ static void keepalive(void (*work)(void *data), void *data) sleep(1 + run/5); run++; } + if (no_sigill) + yaz_log(YLOG_WARN, "keepalive stop. %d SIGILL signal(s)", no_sigill); + if (no_sigabrt) + yaz_log(YLOG_WARN, "keepalive stop. %d SIGABRT signal(s)", no_sigabrt); + if (no_sigsegv) + yaz_log(YLOG_WARN, "keepalive stop. %d SIGSEGV signal(s)", no_sigsegv); + if (no_sigbus) + yaz_log(YLOG_WARN, "keepalive stop. %d SIGBUS signal(s)", no_sigbus); + yaz_log(YLOG_LOG, "keepalive stop"); } #endif