1#ifndef MSTL_CORE_SYSTEM_SIGNAL_HPP__
2#define MSTL_CORE_SYSTEM_SIGNAL_HPP__
7#include "../container/unordered_map.hpp"
8#include "../container/vector.hpp"
9#ifdef MSTL_PLATFORM_LINUX__
14enum class SIGNAL_EVENT {
15#ifdef MSTL_PLATFORM_WINDOWS__
16 INTERRUPT = CTRL_C_EVENT,
17 CTRL_BREAK = CTRL_BREAK_EVENT,
18 CLOSE = CTRL_CLOSE_EVENT,
19 LOGOFF = CTRL_LOGOFF_EVENT,
20 SHUTDOWN = CTRL_SHUTDOWN_EVENT,
25 FLOATING_POINT = 1003,
42 ILLEGAL_INSTR = SIGILL,
43 FLOATING_POINT = SIGFPE,
44 SEGMENT_FAULT = SIGSEGV,
46 PIPE_BROKEN = SIGPIPE,
65struct hash<SIGNAL_EVENT> {
66 size_t operator ()(
const SIGNAL_EVENT e)
const {
67 return hash<int32_t>()(
static_cast<int32_t>(e));
72class MSTL_API signal_manager {
74 using signal_handler = function<bool(SIGNAL_EVENT,
void*)>;
82 condition_variable cv_;
84 unordered_map<SIGNAL_EVENT, signal_handler> handlers_;
86 struct pending_signal {
92 : event{event}, context{context}, timestamp{timestamp} {}
94 vector<pending_signal> pending_signals_;
96#ifdef MSTL_PLATFORM_WINDOWS__
97 vector<::DWORD> registered_windows_events_;
99 struct ::sigaction old_actions_[64];
100 ::timer_t alarm_timer_{
nullptr};
102 static unordered_map<SIGNAL_EVENT, int> windows_to_posix_map_;
105 thread signal_thread_;
106 thread timeout_thread_;
109 void initialize_platform();
110 void cleanup_platform()
const;
112 void signal_thread_func();
113 void timeout_monitor_thread();
115 void process_signal(SIGNAL_EVENT event,
void* context =
nullptr);
120 signal_manager(
const signal_manager&) =
delete;
121 signal_manager& operator =(
const signal_manager&) =
delete;
122 signal_manager(
const signal_manager&&) =
delete;
123 signal_manager& operator =(
const signal_manager&&) =
delete;
126 static signal_manager& instance() {
127 static signal_manager instance;
131 void register_handler(SIGNAL_EVENT event, signal_handler handler);
132 void register_handlers(
const vector<SIGNAL_EVENT>& events, signal_handler handler);
133 void remove_handler(SIGNAL_EVENT event);
135 SIGNAL_EVENT wait_for_signal(
int timeout_ms = -1);
137 void send_signal(SIGNAL_EVENT event,
void* context =
nullptr);
138 void set_force_exit_timeout(
int timeout_ms);
140 void start_monitoring();
141 void stop_monitoring();
143 bool is_running()
const;
145 bool block_signals(
const vector<SIGNAL_EVENT>& signals_to_block)
const;
146 bool unblock_signals(
const vector<SIGNAL_EVENT>& signals_to_unblock)
const;
148 static bool is_platform_signal(SIGNAL_EVENT event) {
149#ifdef MSTL_PLATFORM_WINDOWS__
150 ::DWORD value =
static_cast<::DWORD
>(event);
151 return value <= CTRL_SHUTDOWN_EVENT;
153 int value =
static_cast<int>(event);
154 return value > 0 && value < 64 && value != SIGALRM;
163 signal_manager::instance().start_monitoring();
166 signal_manager::instance().stop_monitoring();
atomic< bool > atomic_bool
布尔原子类型
atomic< int > atomic_int
整型原子类型
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
_MSTL time_point< steady_clock > time_point
时间点类型