mirror of git://git.musl-libc.org/musl
simplify atexit and fflush-on-exit handling
This commit is contained in:
parent
8e8ddeff7e
commit
f753049a50
|
@ -12,18 +12,15 @@ static struct fl
|
||||||
void (*f[COUNT])(void);
|
void (*f[COUNT])(void);
|
||||||
} builtin, *head;
|
} builtin, *head;
|
||||||
|
|
||||||
static int run_atexit_functions(void)
|
void __funcs_on_exit()
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (; head; head=head->next) {
|
for (; head; head=head->next) {
|
||||||
for (i=COUNT-1; i>=0 && !head->f[i]; i--);
|
for (i=COUNT-1; i>=0 && !head->f[i]; i--);
|
||||||
for (; i>=0; i--) head->f[i]();
|
for (; i>=0; i--) head->f[i]();
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int (*const __funcs_on_exit)(void) = run_atexit_functions;
|
|
||||||
|
|
||||||
int atexit(void (*func)(void))
|
int atexit(void (*func)(void))
|
||||||
{
|
{
|
||||||
static int lock;
|
static int lock;
|
||||||
|
|
|
@ -3,8 +3,11 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "libc.h"
|
#include "libc.h"
|
||||||
|
|
||||||
/* __overflow.c and atexit.c override these */
|
static void dummy()
|
||||||
static int (*const dummy)() = 0;
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/* __towrite.c and atexit.c override these */
|
||||||
weak_alias(dummy, __funcs_on_exit);
|
weak_alias(dummy, __funcs_on_exit);
|
||||||
weak_alias(dummy, __fflush_on_exit);
|
weak_alias(dummy, __fflush_on_exit);
|
||||||
|
|
||||||
|
@ -16,8 +19,8 @@ void exit(int code)
|
||||||
LOCK(&lock);
|
LOCK(&lock);
|
||||||
|
|
||||||
/* Only do atexit & stdio flush if they were actually used */
|
/* Only do atexit & stdio flush if they were actually used */
|
||||||
if (__funcs_on_exit) __funcs_on_exit();
|
__funcs_on_exit();
|
||||||
if (__fflush_on_exit) __fflush_on_exit((void *)0);
|
__fflush_on_exit();
|
||||||
|
|
||||||
/* Destructor s**t is kept separate from atexit to avoid bloat */
|
/* Destructor s**t is kept separate from atexit to avoid bloat */
|
||||||
if (libc.fini) libc.fini();
|
if (libc.fini) libc.fini();
|
||||||
|
|
|
@ -18,4 +18,7 @@ int __towrite(FILE *f)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Link flush-on-exit code iff any stdio write functions are linked. */
|
/* Link flush-on-exit code iff any stdio write functions are linked. */
|
||||||
int (*const __fflush_on_exit)(FILE *) = fflush;
|
void __fflush_on_exit()
|
||||||
|
{
|
||||||
|
fflush(0);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue