2003-11-23 18:12:54 +00:00
|
|
|
#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)();
|
|
|
|
}
|
2006-02-12 19:40:55 +00:00
|
|
|
if(s == 0 || *s == 0)
|
|
|
|
exit(0);
|
|
|
|
exit(exitcode(s));
|
2003-11-23 18:12:54 +00:00
|
|
|
}
|