Blob


1 #include <u.h>
2 #include <libc.h>
4 #define NEXIT 33
6 static Lock onexlock;
7 static struct
8 {
9 void (*f)(void);
10 int pid;
11 }onex[NEXIT];
13 int
14 atexit(void (*f)(void))
15 {
16 int i;
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 }
30 void
31 atexitdont(void (*f)(void))
32 {
33 int i, pid;
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 }
41 void
42 exits(char *s)
43 {
44 int i, pid;
45 void (*f)(void);
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 }