Return NULL thread local storage instead of raising exception
[libi2ncommon] / utils / signalfunc.hpp
CommitLineData
f3311b30
TJ
1/*
2The software in this package is distributed under the GNU General
3Public License version 2 (with a special exception described below).
4
5A copy of GNU General Public License (GPL) is included in this distribution,
6in the file COPYING.GPL.
7
8As a special exception, if other files instantiate templates or use macros
9or inline functions from this file, or you compile this file and link it
10with other works to produce a work based on this file, this file
11does not by itself cause the resulting work to be covered
12by the GNU General Public License.
13
14However the source code for this file must still be made available
15in accordance with section (3) of the GNU General Public License.
16
17This exception does not invalidate any other reasons why a work based
18on this file might be covered by the GNU General Public License.
19*/
e525f445
RP
20/** @file
21 * @brief provides wrapper and tools for signal related stuff.
22 *
23 *
24 * @copyright © Copyright 2007-2008 by Intra2net AG
e525f445
RP
25 *
26 * @bug
27 * Although most stuff should work under most POSIX like systems;
28 * some funcs might be very linux related.
29 * (But at least we use that lib currently under linux only.)
30 */
31
32#ifndef _I2N_SIGNALFUNC_HPP_
33#define _I2N_SIGNALFUNC_HPP_
34
35#include <vector>
36
37// with pain in the stomach; the following include was added....:
38// (since these includes a lot of #define's... what we usually don't want to have in C++ headers...)
39#include <sys/types.h>
40
41extern "C"
42{
43
44struct siginfo;
45
46}
47
48
49namespace I2n
50{
51namespace SystemTools
52{
53
54
55namespace Detail
56{
57
58/**
59 * base class for internal implementation classes.
60 */
61class SObject
62{
63 public:
64 virtual ~SObject() {}
65}; // eo class SObject
66
67} // eo namespace Detail
68
69/**
70 * @brief representation of system signal.
71 *
72 * This struct also provides constants for the usual system signals; so it is not necessary to include signal.h
73 * for obtaining the constants.
74 *
75 * Due to an appropriate cast operator instances of the class can be used in all places where
76 * a plain signal (i.e. an int) is expected.
77 */
78struct Signal
79{
80 static const int VOID;
81/// @cond
82
83#define SIG(s) static const int s
84 SIG(HUP); SIG(INT); SIG(QUIT); SIG(ILL); SIG(TRAP);
85 SIG(ABRT); SIG(IOT); SIG(BUS); SIG(FPE); SIG(KILL);
86 SIG(USR1); SIG(SEGV); SIG(USR2); SIG(PIPE); SIG(ALRM);
87 SIG(TERM); SIG(STKFLT); SIG(CLD); SIG(CHLD); SIG(CONT); SIG(STOP);
88 SIG(TSTP); SIG(TTIN); SIG(TTOU); SIG(URG); SIG(XCPU);
89 SIG(XFSZ); SIG(VTALRM); SIG(PROF); SIG(WINCH); SIG(POLL);
90 SIG(IO); SIG(PWR); SIG(SYS);
91#undef SIG
92
93/// @endcond
94
95 static int RT(int num=0);
96
97 int Value;
98
99 Signal(int signal) : Value(signal) {}
100
101 operator int () const { return Value; }
102}; // eo struct Signal
103
104
105/**
106 * @brief representation of signal codes.
107 *
108 * This struct provides constants for signal codes; so it is not necessary to include signal.h
109 * for obtaining the constants.
110 *
111 * Due to an appropriate cast operator instances of the class can be used in all places where
112 * a plain signal code (i.e. an int) is expected.
113 */
114struct SignalCode
115{
116
117
118/// @cond
119#define CODE(name) static const int name
120 CODE(USER); CODE(QUEUE); CODE(TIMER); CODE(MESGQ);
121 CODE(ASYNCIO);
122#undef SIGIO
123 CODE(SIGIO);
124/// @endcond
125
126 /**
127 * @brief contains the codes for signal SIGILL
128 */
129 struct ILL
130 {
131 /// @cond
132 CODE(ILLOPC); CODE(ILLOPN); CODE(ILLADR); CODE(ILLTRP);
133 CODE(PRVOPC); CODE(PRVREG); CODE(COPROC); CODE(BADSTK);
134 /// @endcond
135 }; // eo struct ILL;
136
137
138 /**
139 * @brief contains the codes for signal SIGFPE
140 */
141 struct FPE
142 {
143 /// @cond
144 CODE(INTDIV); CODE(INTOVF); CODE(FLTDIV); CODE(FLTOVF);
145 CODE(FLTUND); CODE(FLTRES); CODE(FLTINV); CODE(FLTSUB);
146 /// @endcond
147 }; // eo struct FPE
148
149
150 /**
151 * @brief contains the codes for signal SIGSEGV
152 */
153 struct SEGV
154 {
155 /// @cond
156 CODE(MAPERR); CODE(ACCERR);
157 /// @endcond
158 }; // eo struct SEGV
159
160
161 /**
162 * @brief contains the codes for signal SIGBUS
163 */
164 struct BUS
165 {
166 /// @cond
167 CODE(ADRALN); CODE(ADRERR); CODE(OBJERR);
168 /// @endcond
169 }; // eo struct BUS
170
171
172 /**
173 * @brief contains the codes for signal SIGTRAP
174 */
175 struct TRAP
176 {
177 /// @cond
178 CODE(BRKPT); CODE(TRACE);
179 /// @endcond
180 }; // eo struct TRAP
181
182
183 /**
184 * @brief contains the codes for signal SIGCHLD
185 */
186 struct CHLD
187 {
188 /// @cond
189 CODE(EXITED); CODE(KILLED); CODE(DUMPED); CODE(TRAPPED);
190 CODE(STOPPED); CODE(CONTINUED);
191 /// @endcond
192 }; // eo struct CHLD
193
194
195 /**
196 * @brief contains the codes for signal SIGPOLL
197 */
198 struct POLL
199 {
200 /// @cond
201 CODE(IN); CODE(OUT); CODE(MSG); CODE(ERR); CODE(PRI); CODE(HUP);
202 /// @endcond
203 }; // eo strcut POLL
204
205#undef CODE
206
207 int TheCode;
208
209 SignalCode(int code) : TheCode(code) {}
210
211 operator int () const { return TheCode; }
212}; // eo SignalCode
213
214
215
216
217/**
218 * @brief helper for blocking a (or some) signal(s) during an operation.
219 *
220 * This class blocks the given signals when constructed and resets the original block mask
221 * when destructed.
222 */
223class ScopedSignalBlocker
224{
225 public:
226 ScopedSignalBlocker(Signal sig);
227 ScopedSignalBlocker(Signal sig1, Signal sig2);
228 ScopedSignalBlocker(Signal sig1, Signal sig2, Signal sig3);
229 ScopedSignalBlocker(const std::vector<Signal>& sigs);
230 virtual ~ScopedSignalBlocker();
231
232 private:
233 Detail::SObject* Implementation;
234
235}; // eo class ScopedSignalBlocker
236
237
238
239
240bool install_signal_handler(
241 Signal sig,
242 void(*handler)(int)
243);
244
245bool install_signal_handler(
246 Signal sig,
247 void(*handler)(int,struct siginfo*,void*)
248);
249
250bool ignore_signal(Signal sig);
251bool install_default_signal_handler(Signal sig);
252
253bool restore_signal_handler(Signal sig);
254
255
256bool send_signal( pid_t pid, Signal signal);
257
258
259} // eo namespace SysTools
260} // eo namespace I2n
261
262#endif