1ff19dbeeb9b41ba3f9548f05a159ab63cdcacf1
[musl] / src / exit / exit.c
1 #include <stdlib.h>
2 #include <unistd.h>
3 #include <stdio.h>
4 #include "libc.h"
5
6 static void dummy()
7 {
8 }
9
10 /* __towrite.c and atexit.c override these */
11 weak_alias(dummy, __funcs_on_exit);
12 weak_alias(dummy, __fflush_on_exit);
13
14 void exit(int code)
15 {
16         static int lock;
17
18         /* If more than one thread calls exit, hang until _Exit ends it all */
19         LOCK(&lock);
20
21         /* Only do atexit & stdio flush if they were actually used */
22         __funcs_on_exit();
23         __fflush_on_exit();
24
25         /* Destructor s**t is kept separate from atexit to avoid bloat */
26         if (libc.fini) libc.fini();
27         if (libc.ldso_fini) libc.ldso_fini();
28
29         _Exit(code);
30         for(;;);
31 }