123456789101112131415161718192021222324252627282930313233 |
- #include <stdlib.h>
- #include "libc.h"
- #include "lock.h"
- #include "fork_impl.h"
- #define COUNT 32
- static void (*funcs[COUNT])(void);
- static int count;
- static volatile int lock[1];
- volatile int *const __at_quick_exit_lockptr = lock;
- void __funcs_on_quick_exit()
- {
- void (*func)(void);
- LOCK(lock);
- while (count > 0) {
- func = funcs[--count];
- UNLOCK(lock);
- func();
- LOCK(lock);
- }
- }
- int at_quick_exit(void (*func)(void))
- {
- int r = 0;
- LOCK(lock);
- if (count == 32) r = -1;
- else funcs[count++] = func;
- UNLOCK(lock);
- return r;
- }
|