diff options
Diffstat (limited to 'src/exit/atexit.c')
-rw-r--r-- | src/exit/atexit.c | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/src/exit/atexit.c b/src/exit/atexit.c index be827181..2b58b8bb 100644 --- a/src/exit/atexit.c +++ b/src/exit/atexit.c @@ -12,18 +12,16 @@ static struct fl void *a[COUNT]; } builtin, *head; +static int slot; static volatile 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; i--) { - if (!head->f[i]) continue; - func = head->f[i]; - arg = head->a[i]; - head->f[i] = 0; + for (; head; head=head->next, slot=COUNT) while(slot-->0) { + func = head->f[slot]; + arg = head->a[slot]; UNLOCK(lock); func(arg); LOCK(lock); @@ -36,15 +34,13 @@ void __cxa_finalize(void *dso) int __cxa_atexit(void (*func)(void *), void *arg, void *dso) { - int i; - LOCK(lock); /* Defer initialization of head so it can be in BSS */ if (!head) head = &builtin; /* If the current function list is full, add a new one */ - if (head->f[COUNT-1]) { + if (slot==COUNT) { struct fl *new_fl = calloc(sizeof(struct fl), 1); if (!new_fl) { UNLOCK(lock); @@ -52,12 +48,13 @@ int __cxa_atexit(void (*func)(void *), void *arg, void *dso) } new_fl->next = head; head = new_fl; + slot = 0; } /* Append function to the list. */ - for (i=0; i<COUNT && head->f[i]; i++); - head->f[i] = func; - head->a[i] = arg; + head->f[slot] = func; + head->a[slot] = arg; + slot++; UNLOCK(lock); return 0; |