xref: /aosp_15_r20/external/musl/src/exit/at_quick_exit.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
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 Worker void __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 Worker int 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