49class NEFORCE_API system_signal_manager {
58#ifdef NEFORCE_PLATFORM_WINDOWS
59 INTERRUPT = CTRL_C_EVENT,
60 CTRL_BREAK = CTRL_BREAK_EVENT,
62 LOGOFF = CTRL_LOGOFF_EVENT,
63 SHUTDOWN = CTRL_SHUTDOWN_EVENT,
68 FLOATING_POINT = 1003,
85 ILLEGAL_INSTR = SIGILL,
86 FLOATING_POINT = SIGFPE,
87 SEGMENT_FAULT = SIGSEGV,
89 PIPE_BROKEN = SIGPIPE,
120 struct signal_result {
129 struct pending_signal {
140 atomic<bool> running_{
false};
141 atomic<bool> force_exit_{
false};
142 atomic<int> force_exit_timeout_{5000};
144 atomic<int> guard_count_{0};
147 condition_variable cv_;
149 unordered_map<event, signal_handler> handlers_;
150 vector<pending_signal> pending_signals_;
152#ifdef NEFORCE_PLATFORM_WINDOWS
153 system_event notify_event_;
155 struct ::sigaction old_actions_[64]{};
158 thread signal_thread_;
159 thread timeout_thread_;
161 friend class signal_guard;
163 system_signal_manager();
165 void add_guard_ref() {
166 if (guard_count_++ == 0) {
171 void remove_guard_ref() noexcept {
172 if (--guard_count_ == 0) {
180 void signal_thread_func();
181 void timeout_monitor_thread();
183 void process_signal(event event,
void* context);
184 void trigger_force_exit();
185 signal_result wait_for_signal_internal(
int timeout_ms = -1);
186 void send_signal_nolock(event event,
void* context);
189 system_signal_manager(
const system_signal_manager&) =
delete;
190 system_signal_manager& operator=(
const system_signal_manager&) =
delete;
191 system_signal_manager(
const system_signal_manager&&) =
delete;
192 system_signal_manager& operator=(
const system_signal_manager&&) =
delete;
194 ~system_signal_manager();
201 static system_signal_manager
instance;
292#ifdef NEFORCE_PLATFORM_WINDOWS
293 return static_cast<::DWORD
>(
event) <= CTRL_SHUTDOWN_EVENT;
295 int v =
static_cast<int>(
event);
296 return v > 0 && v < 64;