22#include < assert.h>
33#include < set>
44
5- #ifndef _WIN32
6-
7- #include < signal.h>
8-
9- #else
10-
115#include < windows.h>
126
13- #endif // !_WIN32
14-
157// There can be only ONE SignalHandler per process
168SignalHandler* g_handler (NULL );
179
18- #ifdef _WIN32
19-
2010BOOL WINAPI WIN32_handleFunc (DWORD);
2111int WIN32_physicalToLogical (DWORD);
2212DWORD WIN32_logicalToPhysical (int );
2313std::set<int > g_registry;
2414
25- #else // _WIN32
26-
27- void POSIX_handleFunc (int );
28- int POSIX_physicalToLogical (int );
29- int POSIX_logicalToPhysical (int );
30-
31- #endif // _WIN32
32-
3315SignalHandler::SignalHandler (int mask) : _mask(mask)
3416{
3517assert (g_handler == NULL );
3618g_handler = this ;
3719
38- #ifdef _WIN32
3920SetConsoleCtrlHandler (WIN32_handleFunc, TRUE );
40- #endif // _WIN32
4121
4222for (int i=0 ;i<numSignals;i++)
4323{
4424int logical = 0x1 << i;
4525if (_mask & logical)
4626{
47- #ifdef _WIN32
4827g_registry.insert (logical);
49- #else
50- int sig = POSIX_logicalToPhysical (logical);
51- bool failed = signal (sig, POSIX_handleFunc) == SIG_ERR;
52- assert (!failed);
53- (void )failed; // Silence the warning in non _DEBUG; TODO: something better
54-
55- #endif // _WIN32
5628}
5729}
5830
5931}
6032
6133SignalHandler::~SignalHandler ()
6234{
63- #ifdef _WIN32
6435SetConsoleCtrlHandler (WIN32_handleFunc, FALSE );
65- #else
66- for (int i=0 ;i<numSignals;i++)
67- {
68- int logical = 0x1 << i;
69- if (_mask & logical)
70- {
71- signal (POSIX_logicalToPhysical (logical), SIG_DFL);
72- }
73- }
74- #endif // _WIN32
7536}
7637
77-
78- #ifdef _WIN32
7938DWORD WIN32_logicalToPhysical (int signal)
8039{
8140switch (signal)
@@ -87,25 +46,7 @@ DWORD WIN32_logicalToPhysical(int signal)
8746return ~(unsigned int )0 ; // SIG_ERR = -1
8847}
8948}
90- #else
91- int POSIX_logicalToPhysical (int signal)
92- {
93- switch (signal)
94- {
95- case SignalHandler::SIG_INT: return SIGINT;
96- case SignalHandler::SIG_TERM: return SIGTERM;
97- // In case the client asks for a SIG_CLOSE handler, accept and
98- // bind it to a SIGTERM. Anyway the signal will never be raised
99- case SignalHandler::SIG_CLOSE: return SIGTERM;
100- case SignalHandler::SIG_RELOAD: return SIGHUP;
101- default :
102- return -1 ; // SIG_ERR = -1
103- }
104- }
105- #endif // _WIN32
106-
10749
108- #ifdef _WIN32
10950int WIN32_physicalToLogical (DWORD signal)
11051{
11152switch (signal)
@@ -117,23 +58,7 @@ int WIN32_physicalToLogical(DWORD signal)
11758return SignalHandler::SIG_UNHANDLED;
11859}
11960}
120- #else
121- int POSIX_physicalToLogical (int signal)
122- {
123- switch (signal)
124- {
125- case SIGINT: return SignalHandler::SIG_INT;
126- case SIGTERM: return SignalHandler::SIG_TERM;
127- case SIGHUP: return SignalHandler::SIG_RELOAD;
128- default :
129- return SignalHandler::SIG_UNHANDLED;
130- }
131- }
132- #endif // _WIN32
133-
13461
135-
136- #ifdef _WIN32
13762BOOL WINAPI WIN32_handleFunc (DWORD signal)
13863{
13964if (g_handler)
@@ -157,13 +82,3 @@ BOOL WINAPI WIN32_handleFunc(DWORD signal)
15782return FALSE ;
15883}
15984}
160- #else
161- void POSIX_handleFunc (int signal)
162- {
163- if (g_handler)
164- {
165- int signo = POSIX_physicalToLogical (signal);
166- g_handler->handleSignal (signo);
167- }
168- }
169- #endif // _WIN32
0 commit comments