github.com/afumu/libc@v0.0.6/musl/src/exit/abort.c (about) 1 #include <stdlib.h> 2 #include <signal.h> 3 #include "syscall.h" 4 #include "pthread_impl.h" 5 #include "atomic.h" 6 #include "lock.h" 7 #include "ksigaction.h" 8 9 hidden volatile int __abort_lock[1]; 10 11 _Noreturn void abort(void) 12 { 13 raise(SIGABRT); 14 15 /* If there was a SIGABRT handler installed and it returned, or if 16 * SIGABRT was blocked or ignored, take an AS-safe lock to prevent 17 * sigaction from installing a new SIGABRT handler, uninstall any 18 * handler that may be present, and re-raise the signal to generate 19 * the default action of abnormal termination. */ 20 __block_all_sigs(0); 21 LOCK(__abort_lock); 22 __syscall(SYS_rt_sigaction, SIGABRT, 23 &(struct k_sigaction){.handler = SIG_DFL}, 0, _NSIG/8); 24 __syscall(SYS_tkill, __pthread_self()->tid, SIGABRT); 25 __syscall(SYS_rt_sigprocmask, SIG_UNBLOCK, 26 &(long[_NSIG/(8*sizeof(long))]){1UL<<(SIGABRT-1)}, 0, _NSIG/8); 27 28 /* Beyond this point should be unreachable. */ 29 a_crash(); 30 raise(SIGKILL); 31 _Exit(127); 32 }