X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fexit%2Fatexit.c;h=c31f3dc35261ff6ddc73d9325463c86f117ec926;hb=fcfba99503746e44585d7e318562dd425e8ff390;hp=c613d85baef81a5d366e557a3b20384db4eed946;hpb=b7c683be35586f671d91c9883c9a41920938df9b;p=musl diff --git a/src/exit/atexit.c b/src/exit/atexit.c index c613d85b..c31f3dc3 100644 --- a/src/exit/atexit.c +++ b/src/exit/atexit.c @@ -14,30 +14,33 @@ static struct fl void *a[COUNT]; } builtin, *head; -static int lock; +static int lock[2]; void __funcs_on_exit() { int i; void (*func)(void *), *arg; - LOCK(&lock); - for (; head; head=head->next) { - for (i=COUNT-1; i>=0 && !head->f[i]; i--); - if (i<0) continue; + 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); + UNLOCK(lock); func(arg); - LOCK(&lock); + LOCK(lock); } } +void __cxa_finalize(void *dso) +{ +} + int __cxa_atexit(void (*func)(void *), void *arg, void *dso) { int i; - LOCK(&lock); + LOCK(lock); /* Defer initialization of head so it can be in BSS */ if (!head) head = &builtin; @@ -46,7 +49,7 @@ int __cxa_atexit(void (*func)(void *), void *arg, void *dso) 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; @@ -58,7 +61,7 @@ int __cxa_atexit(void (*func)(void *), void *arg, void *dso) head->f[i] = func; head->a[i] = arg; - UNLOCK(&lock); + UNLOCK(lock); return 0; }