mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
1555bd7aaa
so that the c library atexit handlers get a chance to run.
54 lines
716 B
C
54 lines
716 B
C
#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)();
|
|
}
|
|
exit(s && *s ? 1 : 0);
|
|
}
|