1#ifndef NEFORCE_CORE_SYSTEM_SIGNAL_HPP__
2#define NEFORCE_CORE_SYSTEM_SIGNAL_HPP__
17#ifdef NEFORCE_COMPILER_MSVC
18# include <consoleapi.h>
20#ifdef NEFORCE_COMPILER_MINGW
24#ifdef NEFORCE_PLATFORM_LINUX
27NEFORCE_BEGIN_NAMESPACE__
43#ifdef NEFORCE_PLATFORM_WINDOWS
46 CLOSE = CTRL_CLOSE_EVENT,
47 LOGOFF = CTRL_LOGOFF_EVENT,
107class NEFORCE_API signal_manager {
121 struct signal_result {
130 struct pending_signal {
141 atomic<bool> running_{
false};
142 atomic<bool> force_exit_{
false};
143 atomic<int> force_exit_timeout_{5000};
146 condition_variable cv_;
148 unordered_map<signal_event, signal_handler> handlers_;
149 vector<pending_signal> pending_signals_;
151#ifdef NEFORCE_PLATFORM_WINDOWS
152 vector<::DWORD> registered_windows_events_;
154 struct ::sigaction old_actions_[64]{};
155 ::timer_t alarm_timer_{
nullptr};
158 thread signal_thread_;
159 thread timeout_thread_;
162 void initialize_platform();
163 void cleanup_platform()
const;
165 void signal_thread_func();
166 void timeout_monitor_thread();
168 void process_signal(
signal_event event,
void* context =
nullptr);
170 signal_result wait_for_signal_internal(
int timeout_ms = -1);
171 void send_signal_nolock(
signal_event event,
void* context =
nullptr);
176 signal_manager(
const signal_manager&) =
delete;
177 signal_manager& operator=(
const signal_manager&) =
delete;
178 signal_manager(
const signal_manager&&) =
delete;
179 signal_manager& operator=(
const signal_manager&&) =
delete;
280#ifdef NEFORCE_PLATFORM_WINDOWS
281 return static_cast<::DWORD
>(event) <= CTRL_SHUTDOWN_EVENT;
283 const int value =
static_cast<int>(event);
284 return value > 0 && value < 64 && value != SIGALRM;
315NEFORCE_END_NAMESPACE__
function< bool(signal_event, void *)> signal_handler
信号处理函数类型
void register_handler(signal_event event, signal_handler handler)
注册信号处理函数
NEFORCE_NODISCARD bool is_running() const
检查是否正在运行
bool unblock_signals(const vector< signal_event > &signals_to_unblock) const
解除信号阻塞
void register_handlers(const vector< signal_event > &events, const signal_handler &handler)
批量注册信号处理函数
static NEFORCE_NODISCARD bool is_platform_signal(signal_event event)
检查是否为平台原生信号
bool block_signals(const vector< signal_event > &signals_to_block) const
阻塞信号
void set_force_exit_timeout(int timeout_ms)
设置强制退出超时时间
signal_event wait_for_signal(int timeout_ms=-1)
等待信号
void start_monitoring()
启动信号监控
void send_signal(signal_event event, void *context=nullptr)
发送信号
void stop_monitoring()
停止信号监控
static signal_manager & instance()
获取单例实例
void remove_handler(signal_event event)
移除信号处理函数
@ CTRL_BREAK
Ctrl+Break(模拟)
_NEFORCE time_point< steady_clock > time_point
时间点类型