Mercurial > dovecot > core-2.2
changeset 12117:7f364dafc675
Added signal_term_counter that keeps track of how many terminal signals have been received.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 14 Sep 2010 17:38:08 +0100 |
parents | 02d78c4a0a51 |
children | 5626fee3b7b9 |
files | src/lib/lib-signals.c src/lib/lib-signals.h |
diffstat | 2 files changed, 19 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/lib-signals.c Tue Sep 14 16:43:10 2010 +0100 +++ b/src/lib/lib-signals.c Tue Sep 14 17:38:08 2010 +0100 @@ -11,6 +11,9 @@ #define MAX_SIGNAL_VALUE 31 +#define SIGNAL_IS_TERMINAL(signo) \ + ((signo) == SIGINT || (signo) == SIGQUIT || (signo) == SIGTERM) + #if !defined(SA_SIGINFO) && !defined(SI_NOINFO) /* without SA_SIGINFO we don't know what the real code is. we need SI_NOINFO to make sure lib_signal_code_to_str() returns "". */ @@ -25,6 +28,8 @@ struct signal_handler *next; }; +volatile unsigned int signal_term_counter = 0; + /* Remember that these are accessed inside signal handler which may be called even while we're initializing/deinitializing. Try hard to keep everything in consistent state. */ @@ -112,6 +117,9 @@ if (signo < 0 || signo > MAX_SIGNAL_VALUE) return; + if (SIGNAL_IS_TERMINAL(signo)) + signal_term_counter++; + /* remember that we're inside a signal handler which might have been called at any time. don't do anything that's unsafe. we might also get interrupted by another signal while inside this handler. */
--- a/src/lib/lib-signals.h Tue Sep 14 16:43:10 2010 +0100 +++ b/src/lib/lib-signals.h Tue Sep 14 17:38:08 2010 +0100 @@ -5,6 +5,17 @@ typedef void signal_handler_t(const siginfo_t *si, void *context); +/* Number of times a "termination signal" has been received. + These signals are SIGINT, SIGQUIT and SIGTERM. Callers can compare this to + their saved previous value to see if a syscall returning EINTR should be + treated as someone wanting to end the process or just some internal signal + that should be ignored, such as SIGCHLD. + + This is marked as volatile so that compiler won't optimize away its + comparisons. It may not work perfectly everywhere, such as when accessing it + isn't atomic, so you shouldn't heavily rely on its actual value. */ +extern volatile unsigned int signal_term_counter; + /* Convert si_code to string */ const char *lib_signal_code_to_str(int signo, int sicode);