| #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)); | 
 | } |