#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)(); | |
} | |
if(s == 0 || *s == 0) | |
exit(0); | |
exit(exitcode(s)); | |
} |