Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 #include "sigchain.h"
  2 #include "cache.h"
  3 
  4 #define SIGCHAIN_MAX_SIGNALS 32
  5 
  6 struct sigchain_signal {
  7         sigchain_fun *old;
  8         int n;
  9         int alloc;
 10 };
 11 static struct sigchain_signal signals[SIGCHAIN_MAX_SIGNALS];
 12 
 13 static void check_signum(int sig)
 14 {
 15         if (sig < 1 || sig >= SIGCHAIN_MAX_SIGNALS)
 16                 die("BUG: signal out of range: %d", sig);
 17 }
 18 
 19 int sigchain_push(int sig, sigchain_fun f)
 20 {
 21         struct sigchain_signal *s = signals + sig;
 22         check_signum(sig);
 23 
 24         ALLOC_GROW(s->old, s->n + 1, s->alloc);
 25         s->old[s->n] = signal(sig, f);
 26         if (s->old[s->n] == SIG_ERR)
 27                 return -1;
 28         s->n++;
 29         return 0;
 30 }
 31 
 32 int sigchain_pop(int sig)
 33 {
 34         struct sigchain_signal *s = signals + sig;
 35         check_signum(sig);
 36         if (s->n < 1)
 37                 return 0;
 38 
 39         if (signal(sig, s->old[s->n - 1]) == SIG_ERR)
 40                 return -1;
 41         s->n--;
 42         return 0;
 43 }
 44 
 45 void sigchain_push_common(sigchain_fun f)
 46 {
 47         sigchain_push(SIGINT, f);
 48         sigchain_push(SIGHUP, f);
 49         sigchain_push(SIGTERM, f);
 50         sigchain_push(SIGQUIT, f);
 51         sigchain_push(SIGPIPE, f);
 52 }
 53 
  This page was automatically generated by the LXR engine.