diff options
Diffstat (limited to 'src/lib9/atexit.c')
-rw-r--r-- | src/lib9/atexit.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/lib9/atexit.c b/src/lib9/atexit.c new file mode 100644 index 00000000..b1d8b977 --- /dev/null +++ b/src/lib9/atexit.c @@ -0,0 +1,54 @@ +#include <u.h> +#include <libc.h> + +#define NEXIT 33 + +static Lock onexlock; +static struct +{ + void (*f)(void); + int pid; +}onex[NEXIT]; + +int +atexit(void (*f)(void)) +{ + int i; + + lock(&onexlock); + for(i=0; i<NEXIT; i++) + if(onex[i].f == 0) { + onex[i].pid = getpid(); + onex[i].f = f; + unlock(&onexlock); + return 1; + } + unlock(&onexlock); + return 0; +} + +void +atexitdont(void (*f)(void)) +{ + int i, pid; + + pid = getpid(); + for(i=0; i<NEXIT; i++) + if(onex[i].f == f && onex[i].pid == pid) + onex[i].f = 0; +} + +void +exits(char *s) +{ + int i, pid; + void (*f)(void); + + pid = getpid(); + for(i = NEXIT-1; i >= 0; i--) + if((f = onex[i].f) && pid == onex[i].pid) { + onex[i].f = 0; + (*f)(); + } + _exits(s); +} |