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