diff options
| author | Junio C Hamano <gitster@pobox.com> | 2009-01-31 17:43:56 -0800 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2009-01-31 17:43:56 -0800 |
| commit | fa5bc8abb35e34f673c41cb5c66d0a2f21536861 (patch) | |
| tree | e76e7f9d8d64db34f148f7ddfa6bca928c194d65 /sigchain.c | |
| parent | 2edefe38a813deb4dfbd62dcf47520aeb1af15fc (diff) | |
| parent | 0ea8039644968e53d79a8dfbf739c87af4261d46 (diff) | |
| download | git-fa5bc8abb35e34f673c41cb5c66d0a2f21536861.tar.gz | |
Merge branch 'jk/signal-cleanup'
* jk/signal-cleanup:
t0005: use SIGTERM for sigchain test
pager: do wait_for_pager on signal death
refactor signal handling for cleanup functions
chain kill signals for cleanup functions
diff: refactor tempfile cleanup handling
Windows: Fix signal numbers
Diffstat (limited to 'sigchain.c')
| -rw-r--r-- | sigchain.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/sigchain.c b/sigchain.c new file mode 100644 index 0000000000..1118b99e57 --- /dev/null +++ b/sigchain.c @@ -0,0 +1,52 @@ +#include "sigchain.h" +#include "cache.h" + +#define SIGCHAIN_MAX_SIGNALS 32 + +struct sigchain_signal { + sigchain_fun *old; + int n; + int alloc; +}; +static struct sigchain_signal signals[SIGCHAIN_MAX_SIGNALS]; + +static void check_signum(int sig) +{ + if (sig < 1 || sig >= SIGCHAIN_MAX_SIGNALS) + die("BUG: signal out of range: %d", sig); +} + +int sigchain_push(int sig, sigchain_fun f) +{ + struct sigchain_signal *s = signals + sig; + check_signum(sig); + + ALLOC_GROW(s->old, s->n + 1, s->alloc); + s->old[s->n] = signal(sig, f); + if (s->old[s->n] == SIG_ERR) + return -1; + s->n++; + return 0; +} + +int sigchain_pop(int sig) +{ + struct sigchain_signal *s = signals + sig; + check_signum(sig); + if (s->n < 1) + return 0; + + if (signal(sig, s->old[s->n - 1]) == SIG_ERR) + return -1; + s->n--; + return 0; +} + +void sigchain_push_common(sigchain_fun f) +{ + sigchain_push(SIGINT, f); + sigchain_push(SIGHUP, f); + sigchain_push(SIGTERM, f); + sigchain_push(SIGQUIT, f); + sigchain_push(SIGPIPE, f); +} |
