|
|
1.1 ! root 1: #include "../plan9/lib.h" ! 2: #include "../plan9/sys9.h" ! 3: #include <signal.h> ! 4: ! 5: /* A stack to hold pcs when signals nest */ ! 6: #define MAXSIGSTACK 20 ! 7: typedef struct Pcstack Pcstack; ! 8: static struct Pcstack { ! 9: int sig; ! 10: void (*hdlr)(int, char*, Ureg*); ! 11: unsigned long restorepc; ! 12: } pcstack[MAXSIGSTACK]; ! 13: static int nstack = 0; ! 14: ! 15: static void notecont(Ureg*, char*); ! 16: ! 17: void ! 18: _notetramp(int sig, void (*hdlr)(int, char*, Ureg*), Ureg *u) ! 19: { ! 20: Pcstack *p; ! 21: ! 22: if(nstack >= MAXSIGSTACK) ! 23: _NOTED(1); /* nesting too deep; just do system default */ ! 24: p = &pcstack[nstack]; ! 25: p->restorepc = u->pc; ! 26: p->sig = sig; ! 27: p->hdlr = hdlr; ! 28: nstack++; ! 29: u->pc = (unsigned long) notecont; ! 30: _NOTED(2); /* NSAVE: clear note but hold state */ ! 31: } ! 32: ! 33: static void ! 34: notecont(Ureg *u, char *s) ! 35: { ! 36: Pcstack *p; ! 37: void(*f)(int, char*, Ureg*); ! 38: ! 39: p = &pcstack[nstack-1]; ! 40: f = p->hdlr; ! 41: u->pc = p->restorepc; ! 42: nstack--; ! 43: (*f)(p->sig, s, u); ! 44: _NOTED(3); /* NRSTR */ ! 45: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.