00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef __UT_Signal_h__
00032 #define __UT_Signal_h__
00033
00034 #include "UT_API.h"
00035 #include <signal.h>
00036
00037 #if defined(GAMEOS)
00038 #include "UT_GameOsUtil.h"
00039
00040 #define SIGINT 2
00041 #define SIGILL 4
00042 #define SIGFPE 8
00043 #define SIGSEGV 11
00044 #define SIGTERM 15
00045
00046 #define SIG_DFL ((__sighandler_t)0)
00047 #define SIG_IGN ((__sighandler_t)1)
00048 #define SIG_ERR ((__sighandler_t)1)
00049 #endif
00050
00051 #if defined(WIN32) || defined(GAMEOS)
00052
00053
00054
00055
00056
00057
00058 #define SIGHUP 1
00059
00060 #define SIGQUIT 3
00061
00062 #define SIGTRAP 5 // Unhandled
00063 #define SIGEMT 7 // Unhandled
00064
00065 #define SIGKILL 9 // Unhandled
00066 #define SIGBUS 10 // Unhandled
00067
00068 #define SIGSYS 12 // Unhandled
00069 #define SIGPIPE 13
00070 #define SIGALRM 14 // Unhandled
00071
00072 #define SIGUSR1 16 // Windows: IOINT?
00073 #define SIGUSR2 17 // Windows: STOP?
00074
00075
00076 #define SIGCLD 18 // Unhandled
00077
00078 #define SIGCHLD 18 // Unhandled
00079 #define SIGPWR 19 // Unhandled
00080 #define SIGWINCH 20 // Unhandled
00081
00082
00083
00084 #define SIGURG 21
00085
00086 #define SIGSTOP 23 // Unhandled
00087 #define SIGTSTP 24 // Unhandled
00088 #define SIGCONT 25 // Unhandled
00089 #define SIGTTIN 26 // Unhandled
00090 #define SIGTTOU 27 // Unhandled
00091 #define SIGVTALRM 28 // Unhandled
00092 #define SIGPROF 29 // Unhandled
00093 #define SIGXCPU 30 // Unhandled
00094 #define SIGXFSZ 31 // Unhandled
00095 #define SIG32 32 // Unhandled
00096
00097
00098 #define SIGPOLL 65 // Unhandled
00099
00100 #define sigset(a,b) signal(a,b)
00101 #else
00102 #if !defined(SIGEMT) && defined(SIGUNUSED)
00103 #define SIGEMT SIGUNUSED
00104 #endif
00105 #if !defined(SIGSYS) && defined(SIGUNUSED)
00106 #define SIGSYS SIGUNUSED
00107 #endif
00108 #endif
00109
00110 #define UT_MAX_SIGNALS 64 // Allow for POSIX standard
00111
00112 #if defined(LINUX) || defined(MBSD)
00113 #define SUPPORTS_SIGINFO
00114 #endif
00115
00116 class UT_API UTsignalHandlerArg
00117 {
00118 public:
00119 UTsignalHandlerArg(int signal_num)
00120 : mySignalNum(signal_num),
00121 myOpaqueCPUContext(0),
00122 myDepthFromSignalHandler(0)
00123 {}
00124
00125
00126
00127
00128
00129 UTsignalHandlerArg(const UTsignalHandlerArg &sig_arg)
00130 : mySignalNum(sig_arg.mySignalNum),
00131 #ifdef SUPPORTS_SIGINFO
00132 mySignalInfo(sig_arg.mySignalInfo),
00133 #endif
00134 myOpaqueCPUContext(sig_arg.myOpaqueCPUContext),
00135 myDepthFromSignalHandler(sig_arg.myDepthFromSignalHandler + 1)
00136 {}
00137
00138 int getSignalNum() const { return mySignalNum; }
00139
00140 #ifdef SUPPORTS_SIGINFO
00141 void setSignalInfo(siginfo_t *signal_info)
00142 {
00143 mySignalInfo = signal_info;
00144 }
00145 const siginfo_t *getSignalInfo() const { return mySignalInfo; }
00146 #endif
00147 void setSignalContext(void *opaque_cpu_context)
00148 {
00149 myOpaqueCPUContext = opaque_cpu_context;
00150 }
00151 const void *getOpaqueCPUContext() const { return myOpaqueCPUContext; }
00152
00153 int getDepthFromSignalHandler() const
00154 { return myDepthFromSignalHandler; }
00155
00156 private:
00157 int mySignalNum;
00158 void *myOpaqueCPUContext;
00159 int myDepthFromSignalHandler;
00160 #ifdef SUPPORTS_SIGINFO
00161 siginfo_t *mySignalInfo;
00162 #endif
00163 };
00164
00165
00166 typedef void (*UTsigHandler)(UTsignalHandlerArg);
00167
00168
00169 #if !defined(LINUX) && !defined(MBSD)
00170 extern "C"
00171 #endif
00172 typedef void (*UToldStyleSigHandler)(int);
00173
00174 class UT_API UT_Signal
00175 {
00176 public:
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187 explicit UT_Signal(int signum=0, UToldStyleSigHandler handler = SIG_DFL,
00188 bool ignore_prev=false);
00189 explicit UT_Signal(int signum, UTsigHandler handler,
00190 bool ignore_prev=false);
00191
00192
00193
00194
00195 UT_Signal(const int signums[], UToldStyleSigHandler handler = SIG_DFL,
00196 bool ignore_prev=false);
00197 UT_Signal(const int signums[], UTsigHandler handler,
00198 bool ignore_prev=false);
00199
00200
00201 ~UT_Signal();
00202
00203
00204
00205
00206
00207
00208 void override(int signum, UToldStyleSigHandler,
00209 bool ignore_prev=false);
00210 void override(int signum, UTsigHandler,
00211 bool ignore_prev=false);
00212
00213 private:
00214
00215
00216
00217 class UT_API UT_ComboSignalHandler
00218 {
00219 public:
00220 UT_ComboSignalHandler();
00221 UT_ComboSignalHandler(UTsigHandler handler);
00222 UT_ComboSignalHandler(UToldStyleSigHandler handler);
00223
00224 UT_ComboSignalHandler &operator=(UTsigHandler handler);
00225 UT_ComboSignalHandler &operator=(UToldStyleSigHandler handler);
00226 bool operator!=(UToldStyleSigHandler handler) const;
00227
00228 bool isSet() const;
00229 void operator()(int signal_num,
00230 #ifdef SUPPORTS_SIGINFO
00231 siginfo_t *signal_info,
00232 #endif
00233 void *opaque_cpu_context) const;
00234
00235 private:
00236 union
00237 {
00238 UTsigHandler myNewStyle;
00239 UToldStyleSigHandler myOldStyle;
00240 } mySigHandler;
00241 bool myIsOldStyleSigHandler;
00242 };
00243
00244 void constructPriv(int signum,
00245 UT_ComboSignalHandler handler,
00246 bool ignore_prev);
00247 void constructPriv(const int signums[],
00248 UT_ComboSignalHandler handler,
00249 bool ignore_prev);
00250 void addSignal(int signum, UT_ComboSignalHandler handler,
00251 bool ignore_prev);
00252 void removeSignal(int signum);
00253 void updateActuals();
00254 void overridePriv(int signum,
00255 UT_ComboSignalHandler handler,
00256 bool ignore_prev);
00257
00258 static void processSignal(int signal_num
00259 #ifdef SUPPORTS_SIGINFO
00260 , siginfo_t *, void *
00261 #endif
00262 );
00263
00264 UT_ComboSignalHandler mySignals[UT_MAX_SIGNALS];
00265 bool myIgnorePrev[UT_MAX_SIGNALS];
00266
00267 UT_Signal *myNext, *myPrev;
00268 };
00269
00270 #endif