mirror of https://git.musl-libc.org/git/musl
3 changed files with 46 additions and 0 deletions
@ -0,0 +1,29 @@ |
|||||
|
#include <stdlib.h> |
||||
|
#include "libc.h" |
||||
|
|
||||
|
#define COUNT 32 |
||||
|
|
||||
|
static void (*funcs[COUNT])(void); |
||||
|
static int count; |
||||
|
static int lock[2]; |
||||
|
|
||||
|
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)) |
||||
|
{ |
||||
|
if (count == 32) return -1; |
||||
|
LOCK(lock); |
||||
|
funcs[count++] = func; |
||||
|
UNLOCK(lock); |
||||
|
return 0; |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
#include <stdlib.h> |
||||
|
#include "syscall.h" |
||||
|
#include "atomic.h" |
||||
|
#include "libc.h" |
||||
|
|
||||
|
static void dummy() { } |
||||
|
weak_alias(dummy, __funcs_on_quick_exit); |
||||
|
|
||||
|
void quick_exit(int code) |
||||
|
{ |
||||
|
static int lock; |
||||
|
while (a_swap(&lock, 1)) __syscall(SYS_pause); |
||||
|
__funcs_on_quick_exit(); |
||||
|
_Exit(code); |
||||
|
} |
||||
Loading…
Reference in new issue