configure: recognize x86_64-x32 and x32
[musl] / src / exit / exit.c
1 #include <stdlib.h>
2 #include <stdint.h>
3 #include "libc.h"
4 #include "atomic.h"
5 #include "syscall.h"
6
7 static void dummy()
8 {
9 }
10
11 /* __toread.c, __towrite.c, and atexit.c override these */
12 weak_alias(dummy, __funcs_on_exit);
13 weak_alias(dummy, __flush_on_exit);
14 weak_alias(dummy, __seek_on_exit);
15
16 #ifndef SHARED
17 weak_alias(dummy, _fini);
18 extern void (*const __fini_array_start)() __attribute__((weak));
19 extern void (*const __fini_array_end)() __attribute__((weak));
20 #endif
21
22 _Noreturn void exit(int code)
23 {
24         static int lock;
25
26         /* If more than one thread calls exit, hang until _Exit ends it all */
27         while (a_swap(&lock, 1)) __syscall(SYS_pause);
28
29         __funcs_on_exit();
30
31 #ifndef SHARED
32         uintptr_t a = (uintptr_t)&__fini_array_end;
33         for (; a>(uintptr_t)&__fini_array_start; a-=sizeof(void(*)()))
34                 (*(void (**)())(a-sizeof(void(*)())))();
35         _fini();
36 #endif
37
38         __flush_on_exit();
39         __seek_on_exit();
40
41         _Exit(code);
42         for(;;);
43 }