MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
signal.hpp
1#ifndef MSTL_CORE_SYSTEM_SIGNAL_HPP__
2#define MSTL_CORE_SYSTEM_SIGNAL_HPP__
3#include "../async/atomic.hpp"
5#include "../async/thread.hpp"
7#include "../container/unordered_map.hpp"
8#include "../container/vector.hpp"
9#ifdef MSTL_PLATFORM_LINUX__
10#include <csignal>
11#endif
13
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,
21
22 TERMINATE = 1000,
23 ABORT = 1001,
24 ILLEGAL_INSTR = 1002,
25 FLOATING_POINT = 1003,
26 SEGMENT_FAULT = 1004,
27 BUS_ERROR = 1005,
28 PIPE_BROKEN = 1006,
29 ALARM = 1007,
30 HANGUP = 1008,
31 USER1 = 1009,
32 USER2 = 1010,
33
34 TIMEOUT = 2000,
35 CUSTOM_1 = 2001,
36 CUSTOM_2 = 2002,
37 FORCE_EXIT = 9999
38#else
39 INTERRUPT = SIGINT,
40 TERMINATE = SIGTERM,
41 ABORT = SIGABRT,
42 ILLEGAL_INSTR = SIGILL,
43 FLOATING_POINT = SIGFPE,
44 SEGMENT_FAULT = SIGSEGV,
45 BUS_ERROR = SIGBUS,
46 PIPE_BROKEN = SIGPIPE,
47 ALARM = SIGALRM,
48 HANGUP = SIGHUP,
49 USER1 = SIGUSR1,
50 USER2 = SIGUSR2,
51
52 CTRL_BREAK = 1000,
53 CLOSE = 1001,
54 LOGOFF = 1002,
55 SHUTDOWN = 1003,
56
57 TIMEOUT = SIGALRM,
58 CUSTOM_1 = 2000,
59 CUSTOM_2 = 2001,
60 FORCE_EXIT = 9999
61#endif
62};
63
64template <>
65struct hash<SIGNAL_EVENT> {
66 size_t operator ()(const SIGNAL_EVENT e) const {
67 return hash<int32_t>()(static_cast<int32_t>(e));
68 }
69};
70
71
72class MSTL_API signal_manager {
73public:
74 using signal_handler = function<bool(SIGNAL_EVENT, void*)>;
75
76private:
77 atomic_bool running_{false};
78 atomic_bool force_exit_{false};
79 atomic_int force_exit_timeout_{5000};
80
81 mutex mutex_;
82 condition_variable cv_;
83
84 unordered_map<SIGNAL_EVENT, signal_handler> handlers_;
85
86 struct pending_signal {
87 SIGNAL_EVENT event;
88 void* context;
90
91 pending_signal(const SIGNAL_EVENT event, void* context, steady_clock::time_point timestamp)
92 : event{event}, context{context}, timestamp{timestamp} {}
93 };
94 vector<pending_signal> pending_signals_;
95
96#ifdef MSTL_PLATFORM_WINDOWS__
97 vector<::DWORD> registered_windows_events_;
98#else
99 struct ::sigaction old_actions_[64];
100 ::timer_t alarm_timer_{nullptr};
101
102 static unordered_map<SIGNAL_EVENT, int> windows_to_posix_map_;
103#endif
104
105 thread signal_thread_;
106 thread timeout_thread_;
107
108private:
109 void initialize_platform();
110 void cleanup_platform() const;
111
112 void signal_thread_func();
113 void timeout_monitor_thread();
114
115 void process_signal(SIGNAL_EVENT event, void* context = nullptr);
116
117 signal_manager();
118
119public:
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;
124 ~signal_manager();
125
126 static signal_manager& instance() {
127 static signal_manager instance;
128 return instance;
129 }
130
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);
134
135 SIGNAL_EVENT wait_for_signal(int timeout_ms = -1);
136
137 void send_signal(SIGNAL_EVENT event, void* context = nullptr);
138 void set_force_exit_timeout(int timeout_ms);
139
140 void start_monitoring();
141 void stop_monitoring();
142
143 bool is_running() const;
144
145 bool block_signals(const vector<SIGNAL_EVENT>& signals_to_block) const;
146 bool unblock_signals(const vector<SIGNAL_EVENT>& signals_to_unblock) const;
147
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;
152#else
153 int value = static_cast<int>(event);
154 return value > 0 && value < 64 && value != SIGALRM;
155#endif
156 }
157};
158
159
160class signal_guard {
161public:
162 signal_guard() {
163 signal_manager::instance().start_monitoring();
164 }
165 ~signal_guard() {
166 signal_manager::instance().stop_monitoring();
167 }
168};
169
171#endif // MSTL_CORE_SYSTEM_SIGNAL_HPP__
MSTL原子类型完整实现
MSTL条件变量行为
MSTL通用函数包装器
atomic< bool > atomic_bool
布尔原子类型
atomic< int > atomic_int
整型原子类型
int int32_t
32位有符号整数类型
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
哈希函数的主模板
_MSTL time_point< steady_clock > time_point
时间点类型
MSTL线程支持