X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=src%2Fexit%2Fatexit.c;h=c31f3dc35261ff6ddc73d9325463c86f117ec926;hp=49c060e6eb9e63c7c47f5dcf2413071140df1c39;hb=a8f73bb1a685dd7d67669c6f6ceb255cfa967790;hpb=0b44a0315b47dd8eced9f3b7f31580cf14bbfc01 diff --git a/src/exit/atexit.c b/src/exit/atexit.c index 49c060e6..c31f3dc3 100644 --- a/src/exit/atexit.c +++ b/src/exit/atexit.c @@ -1,5 +1,6 @@ #include #include +#include #include #include "libc.h" @@ -9,30 +10,37 @@ static struct fl { struct fl *next; - void (*f[COUNT])(void); + void (*f[COUNT])(void *); + void *a[COUNT]; } builtin, *head; -static int run_atexit_functions(void) +static int lock[2]; + +void __funcs_on_exit() { int i; - for (; head; head=head->next) { - for (i=COUNT-1; i>=0 && !head->f[i]; i--); - for (; i>=0; i--) head->f[i](); + void (*func)(void *), *arg; + LOCK(lock); + for (; head; head=head->next) for (i=COUNT-1; i>=0; i--) { + if (!head->f[i]) continue; + func = head->f[i]; + arg = head->a[i]; + head->f[i] = 0; + UNLOCK(lock); + func(arg); + LOCK(lock); } - return 0; } -int (*const __funcs_on_exit)(void) = run_atexit_functions; +void __cxa_finalize(void *dso) +{ +} -int atexit(void (*func)(void)) +int __cxa_atexit(void (*func)(void *), void *arg, void *dso) { - static int lock; int i; - /* Hook for atexit extensions */ - if (libc.atexit) return libc.atexit(func); - - LOCK(&lock); + LOCK(lock); /* Defer initialization of head so it can be in BSS */ if (!head) head = &builtin; @@ -41,7 +49,7 @@ int atexit(void (*func)(void)) if (head->f[COUNT-1]) { struct fl *new_fl = calloc(sizeof(struct fl), 1); if (!new_fl) { - UNLOCK(&lock); + UNLOCK(lock); return -1; } new_fl->next = head; @@ -51,7 +59,18 @@ int atexit(void (*func)(void)) /* Append function to the list. */ for (i=0; if[i]; i++); head->f[i] = func; + head->a[i] = arg; - UNLOCK(&lock); + UNLOCK(lock); return 0; } + +static void call(void *p) +{ + ((void (*)(void))(uintptr_t)p)(); +} + +int atexit(void (*func)(void)) +{ + return __cxa_atexit(call, (void *)(uintptr_t)func, 0); +}