Blame


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