Squashed 'third_party/git/' content from commit cb71568594
git-subtree-dir: third_party/git git-subtree-split: cb715685942260375e1eb8153b0768a376e4ece7
This commit is contained in:
commit
1b593e1ea4
3629 changed files with 1139935 additions and 0 deletions
61
sigchain.c
Normal file
61
sigchain.c
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
#include "cache.h"
|
||||
#include "sigchain.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)
|
||||
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);
|
||||
}
|
||||
|
||||
void sigchain_pop_common(void)
|
||||
{
|
||||
sigchain_pop(SIGPIPE);
|
||||
sigchain_pop(SIGQUIT);
|
||||
sigchain_pop(SIGTERM);
|
||||
sigchain_pop(SIGHUP);
|
||||
sigchain_pop(SIGINT);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue