terminate_with_reason.c [plain text]
#include <sys/reason.h>
#include <sys/types.h>
#include <stdint.h>
#include <signal.h>
#include <unistd.h>
int __terminate_with_payload(int pid, uint32_t reason_namespace, uint64_t reason_code,
void *payload, uint32_t payload_size, const char *reason_string,
uint64_t reason_flags);
void __abort_with_payload(uint32_t reason_namespace, uint64_t reason_code,
void *payload, uint32_t payload_size, const char *reason_string,
uint64_t reason_flags);
static void abort_with_payload_wrapper_internal(uint32_t reason_namespace, uint64_t reason_code,
void *payload, uint32_t payload_size, const char *reason_string,
uint64_t reason_flags) __attribute__((noreturn));
int
terminate_with_reason(int pid, uint32_t reason_namespace, uint64_t reason_code,
const char *reason_string, uint64_t reason_flags)
{
return __terminate_with_payload(pid, reason_namespace, reason_code, 0, 0,
reason_string, reason_flags);
}
int
terminate_with_payload(int pid, uint32_t reason_namespace, uint64_t reason_code,
void *payload, uint32_t payload_size,
const char *reason_string, uint64_t reason_flags)
{
return __terminate_with_payload(pid, reason_namespace, reason_code, payload,
payload_size, reason_string, reason_flags);
}
static void abort_with_payload_wrapper_internal(uint32_t reason_namespace, uint64_t reason_code,
void *payload, uint32_t payload_size, const char *reason_string,
uint64_t reason_flags)
{
sigset_t unmask_signal;
sigemptyset(&unmask_signal);
sigaddset(&unmask_signal, SIGABRT);
sigprocmask(SIG_UNBLOCK, &unmask_signal, NULL);
__abort_with_payload(reason_namespace, reason_code, payload, payload_size,
reason_string, reason_flags);
terminate_with_payload(getpid(), reason_namespace, reason_code, payload, payload_size,
reason_string, reason_flags);
__builtin_unreachable();
}
void
abort_with_reason(uint32_t reason_namespace, uint64_t reason_code, const char *reason_string,
uint64_t reason_flags)
{
abort_with_payload_wrapper_internal(reason_namespace, reason_code, 0, 0, reason_string, reason_flags);
}
void
abort_with_payload(uint32_t reason_namespace, uint64_t reason_code, void *payload,
uint32_t payload_size, const char *reason_string,
uint64_t reason_flags)
{
abort_with_payload_wrapper_internal(reason_namespace, reason_code, payload, payload_size,
reason_string, reason_flags);
}