72 lines · 966 B · C
RawDownload
#include <u.h>#define NOEXITDEFINE#include <libc.h> #define	NEXIT	33 static Lock onexlock;static struct{	void	(*f)(void);	int	pid;}onex[NEXIT]; intatexit(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;} voidatexitdont(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;} voidexits(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));} voidp9exit(int code){	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(code);}