atexit.c (746B)
1 #include <u.h> 2 #include <libc.h> 3 4 #define NEXIT 33 5 6 static Lock onexlock; 7 static struct 8 { 9 void (*f)(void); 10 int pid; 11 }onex[NEXIT]; 12 13 int 14 atexit(void (*f)(void)) 15 { 16 int i; 17 18 lock(&onexlock); 19 for(i=0; i<NEXIT; i++) 20 if(onex[i].f == 0) { 21 onex[i].pid = getpid(); 22 onex[i].f = f; 23 unlock(&onexlock); 24 return 1; 25 } 26 unlock(&onexlock); 27 return 0; 28 } 29 30 void 31 atexitdont(void (*f)(void)) 32 { 33 int i, pid; 34 35 pid = getpid(); 36 for(i=0; i<NEXIT; i++) 37 if(onex[i].f == f && onex[i].pid == pid) 38 onex[i].f = 0; 39 } 40 41 void 42 exits(char *s) 43 { 44 int i, pid; 45 void (*f)(void); 46 47 pid = getpid(); 48 for(i = NEXIT-1; i >= 0; i--) 49 if((f = onex[i].f) && pid == onex[i].pid) { 50 onex[i].f = 0; 51 (*f)(); 52 } 53 if(s == 0 || *s == 0) 54 exit(0); 55 exit(exitcode(s)); 56 }