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 Colombieratexit(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 Colombieratexitdont(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 Colombierexits(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