1*c9945492SAndroid Build Coastguard Worker #include <stdlib.h> 2*c9945492SAndroid Build Coastguard Worker #include "libc.h" 3*c9945492SAndroid Build Coastguard Worker #include "lock.h" 4*c9945492SAndroid Build Coastguard Worker #include "fork_impl.h" 5*c9945492SAndroid Build Coastguard Worker 6*c9945492SAndroid Build Coastguard Worker #define COUNT 32 7*c9945492SAndroid Build Coastguard Worker 8*c9945492SAndroid Build Coastguard Worker static void (*funcs[COUNT])(void); 9*c9945492SAndroid Build Coastguard Worker static int count; 10*c9945492SAndroid Build Coastguard Worker static volatile int lock[1]; 11*c9945492SAndroid Build Coastguard Worker volatile int *const __at_quick_exit_lockptr = lock; 12*c9945492SAndroid Build Coastguard Worker __funcs_on_quick_exit()13*c9945492SAndroid Build Coastguard Workervoid __funcs_on_quick_exit() 14*c9945492SAndroid Build Coastguard Worker { 15*c9945492SAndroid Build Coastguard Worker void (*func)(void); 16*c9945492SAndroid Build Coastguard Worker LOCK(lock); 17*c9945492SAndroid Build Coastguard Worker while (count > 0) { 18*c9945492SAndroid Build Coastguard Worker func = funcs[--count]; 19*c9945492SAndroid Build Coastguard Worker UNLOCK(lock); 20*c9945492SAndroid Build Coastguard Worker func(); 21*c9945492SAndroid Build Coastguard Worker LOCK(lock); 22*c9945492SAndroid Build Coastguard Worker } 23*c9945492SAndroid Build Coastguard Worker } 24*c9945492SAndroid Build Coastguard Worker at_quick_exit(void (* func)(void))25*c9945492SAndroid Build Coastguard Workerint at_quick_exit(void (*func)(void)) 26*c9945492SAndroid Build Coastguard Worker { 27*c9945492SAndroid Build Coastguard Worker int r = 0; 28*c9945492SAndroid Build Coastguard Worker LOCK(lock); 29*c9945492SAndroid Build Coastguard Worker if (count == 32) r = -1; 30*c9945492SAndroid Build Coastguard Worker else funcs[count++] = func; 31*c9945492SAndroid Build Coastguard Worker UNLOCK(lock); 32*c9945492SAndroid Build Coastguard Worker return r; 33*c9945492SAndroid Build Coastguard Worker } 34