xref: /plan9/sys/src/libc/port/atexit.c (revision 31c82b6ea8e6ace8342499282f6de008ecbfae78)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier 
43e12c5d1SDavid du Colombier #define	NEXIT	33
5219b2ee8SDavid du Colombier 
65e91980fSDavid du Colombier typedef struct Onex Onex;
75e91980fSDavid du Colombier struct Onex{
8219b2ee8SDavid du Colombier 	void	(*f)(void);
9219b2ee8SDavid du Colombier 	int	pid;
105e91980fSDavid du Colombier };
115e91980fSDavid du Colombier 
125e91980fSDavid du Colombier static Lock onexlock;
135e91980fSDavid du Colombier Onex onex[NEXIT];
143e12c5d1SDavid du Colombier 
15*31c82b6eSDavid du Colombier int
atexit(void (* f)(void))163e12c5d1SDavid du Colombier atexit(void (*f)(void))
173e12c5d1SDavid du Colombier {
183e12c5d1SDavid du Colombier 	int i;
193e12c5d1SDavid du Colombier 
207dd7cddfSDavid du Colombier 	lock(&onexlock);
213e12c5d1SDavid du Colombier 	for(i=0; i<NEXIT; i++)
22219b2ee8SDavid du Colombier 		if(onex[i].f == 0) {
23219b2ee8SDavid du Colombier 			onex[i].pid = getpid();
247dd7cddfSDavid du Colombier 			onex[i].f = f;
257dd7cddfSDavid du Colombier 			unlock(&onexlock);
263e12c5d1SDavid du Colombier 			return 1;
273e12c5d1SDavid du Colombier 		}
287dd7cddfSDavid du Colombier 	unlock(&onexlock);
293e12c5d1SDavid du Colombier 	return 0;
303e12c5d1SDavid du Colombier }
313e12c5d1SDavid du Colombier 
323e12c5d1SDavid du Colombier void
atexitdont(void (* f)(void))333e12c5d1SDavid du Colombier atexitdont(void (*f)(void))
343e12c5d1SDavid du Colombier {
35219b2ee8SDavid du Colombier 	int i, pid;
363e12c5d1SDavid du Colombier 
37219b2ee8SDavid du Colombier 	pid = getpid();
383e12c5d1SDavid du Colombier 	for(i=0; i<NEXIT; i++)
39219b2ee8SDavid du Colombier 		if(onex[i].f == f && onex[i].pid == pid)
40219b2ee8SDavid du Colombier 			onex[i].f = 0;
413e12c5d1SDavid du Colombier }
423e12c5d1SDavid du Colombier 
43e288d156SDavid du Colombier #pragma profile off
44e288d156SDavid du Colombier 
453e12c5d1SDavid du Colombier void
exits(char * s)463e12c5d1SDavid du Colombier exits(char *s)
473e12c5d1SDavid du Colombier {
48219b2ee8SDavid du Colombier 	int i, pid;
493e12c5d1SDavid du Colombier 	void (*f)(void);
503e12c5d1SDavid du Colombier 
51219b2ee8SDavid du Colombier 	pid = getpid();
523e12c5d1SDavid du Colombier 	for(i = NEXIT-1; i >= 0; i--)
53219b2ee8SDavid du Colombier 		if((f = onex[i].f) && pid == onex[i].pid) {
54219b2ee8SDavid du Colombier 			onex[i].f = 0;
553e12c5d1SDavid du Colombier 			(*f)();
563e12c5d1SDavid du Colombier 		}
573e12c5d1SDavid du Colombier 	_exits(s);
583e12c5d1SDavid du Colombier }
59e288d156SDavid du Colombier 
60e288d156SDavid du Colombier #pragma profile on
61