1#include "error_handling.h"
3ErrorState *ErrorStateRegistry::custom_error_state_ =
nullptr;
10std::string &get_status_message()
15sigjmp_buf &get_sigjmp_buf_point()
17 static sigjmp_buf sigjmp_buf_point;
18 return sigjmp_buf_point;
21std::mutex &get_sigint_hook_mutex()
23 static std::mutex sigint_hook_mutex;
24 return sigint_hook_mutex;
27std::vector<Hook> &get_sigint_hooks()
29 static std::vector<Hook> sigint_hooks;
33void fail(std::string message,
int code)
36 error_state.status_code = code;
37 error_state.status_message = message;
40void handle_exception(
int code)
46 catch (
const std::exception &ex)
48 fail(ex.what(), code);
52 fail(
"Caught unknown exception", code);
56sigjmp_buf &get_jump_point()
58 sigjmp_buf &sigjmp_buf_point = get_sigjmp_buf_point();
60 return sigjmp_buf_point;
64 thread_local sigjmp_buf* current_jump_point =
nullptr;
67sigjmp_buf* get_current_jump_point_ptr()
69 return current_jump_point;
72void set_current_jump_point(sigjmp_buf* jump_point)
74 current_jump_point = jump_point;
77static void handle_terminate()
79 crash_signal_handler(1);
84BOOL WINAPI console_ctrl_handler(DWORD ctrl_type)
86 if (ctrl_type == CTRL_C_EVENT || ctrl_type == CTRL_CLOSE_EVENT)
88 sigint_signal_handler(SIGINT);
94void set_error_handlers(
bool crash_handlers,
bool sigint_handlers)
100 signal(SIGSEGV, crash_signal_handler);
101 signal(SIGFPE, crash_signal_handler);
102 std::set_terminate(handle_terminate);
107 signal(SIGINT, sigint_signal_handler);
108 signal(SIGTERM, sigint_signal_handler);
109 SetConsoleCtrlHandler(console_ctrl_handler, TRUE);
115void handle_signal(
int sig, siginfo_t *,
void *)
117 crash_signal_handler(sig);
120void set_error_handlers(
bool crash_handlers,
bool sigint_handlers)
126 struct sigaction sa{};
127 sigemptyset(&sa.sa_mask);
128 sa.sa_flags = SA_NODEFER;
129 sa.sa_sigaction = handle_signal;
131 sigaction(SIGSEGV, &sa,
nullptr);
132 sigaction(SIGFPE, &sa,
nullptr);
134 std::set_terminate(handle_terminate);
139 struct sigaction shutdown{};
140 shutdown.sa_handler = sigint_signal_handler;
141 sigemptyset(&shutdown.sa_mask);
142 shutdown.sa_flags = 0;
144 sigaction(SIGINT, &shutdown,
nullptr);
145 sigaction(SIGTERM, &shutdown,
nullptr);
150void crash_signal_handler(
int sig)
152 fail(
"Severe error occurred", sig);
153 sigjmp_buf* jump_point = get_current_jump_point_ptr();
154 if (jump_point) siglongjmp(*jump_point, 1);
158void sigint_signal_handler(
int sig)
160 std::vector<Hook> &sigint_hooks = get_sigint_hooks();
161 std::lock_guard<std::mutex> lock(get_sigint_hook_mutex());
162 for (
auto &hook : sigint_hooks)
174void register_sigint_hook(Hook hook)
176 std::vector<Hook> &sigint_hooks = get_sigint_hooks();
177 std::lock_guard<std::mutex> lock(get_sigint_hook_mutex());
178 sigint_hooks.push_back(std::move(hook));
static ErrorState & get_error_state()
Get the error state instance.
Error state container for sharing between libraries.