Blame view

kernel/linux-imx6_3.14.28/tools/perf/util/sigchain.c 976 Bytes
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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);
  }
  
  static 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);
  }