31 lines
917 B
C
31 lines
917 B
C
#include <stdlib.h>
|
|
#include <signal.h>
|
|
#include "syscall.h"
|
|
#include "pthread_impl.h"
|
|
#include "atomic.h"
|
|
#include "lock.h"
|
|
#include "ksigaction.h"
|
|
|
|
_Noreturn void abort(void)
|
|
{
|
|
raise(SIGABRT);
|
|
|
|
/* If there was a SIGABRT handler installed and it returned, or if
|
|
* SIGABRT was blocked or ignored, take an AS-safe lock to prevent
|
|
* sigaction from installing a new SIGABRT handler, uninstall any
|
|
* handler that may be present, and re-raise the signal to generate
|
|
* the default action of abnormal termination. */
|
|
__block_all_sigs(0);
|
|
LOCK(__abort_lock);
|
|
__syscall(SYS_rt_sigaction, SIGABRT,
|
|
&(struct k_sigaction){.handler = SIG_DFL}, 0, _NSIG/8);
|
|
__syscall(SYS_tkill, __pthread_self()->tid, SIGABRT);
|
|
__syscall(SYS_rt_sigprocmask, SIG_UNBLOCK,
|
|
&(long[_NSIG/(8*sizeof(long))]){1UL<<(SIGABRT-1)}, 0, _NSIG/8);
|
|
|
|
/* Beyond this point should be unreachable. */
|
|
a_crash();
|
|
raise(SIGKILL);
|
|
_Exit(127);
|
|
}
|