00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef SIG_H
00014 #define SIG_H
00015 #include <errno.h>
00016
00017 #ifdef _WIN32
00018 typedef LONG rb_atomic_t;
00019
00020 # define ATOMIC_TEST(var) InterlockedExchange(&(var), 0)
00021 # define ATOMIC_SET(var, val) InterlockedExchange(&(var), (val))
00022 # define ATOMIC_INC(var) InterlockedIncrement(&(var))
00023 # define ATOMIC_DEC(var) InterlockedDecrement(&(var))
00024
00025
00026 # define TRAP_BEG do {\
00027 int saved_errno = 0;\
00028 rb_atomic_t trap_immediate = ATOMIC_SET(rb_trap_immediate, 1)
00029 # define TRAP_END\
00030 ATOMIC_SET(rb_trap_immediate, trap_immediate);\
00031 saved_errno = errno;\
00032 CHECK_INTS;\
00033 errno = saved_errno;\
00034 } while (0)
00035 # define RUBY_CRITICAL(statements) do {\
00036 rb_w32_enter_critical();\
00037 statements;\
00038 rb_w32_leave_critical();\
00039 } while (0)
00040 #else
00041 typedef int rb_atomic_t;
00042
00043 # define ATOMIC_TEST(var) ((var) ? ((var) = 0, 1) : 0)
00044 # define ATOMIC_SET(var, val) ((var) = (val))
00045 # define ATOMIC_INC(var) (++(var))
00046 # define ATOMIC_DEC(var) (--(var))
00047
00048 # define TRAP_BEG do {\
00049 int saved_errno = 0;\
00050 int trap_immediate = rb_trap_immediate;\
00051 rb_trap_immediate = 1
00052 # define TRAP_END rb_trap_immediate = trap_immediate;\
00053 saved_errno = errno;\
00054 CHECK_INTS;\
00055 errno = saved_errno;\
00056 } while (0)
00057
00058 # define RUBY_CRITICAL(statements) do {\
00059 int trap_immediate = rb_trap_immediate;\
00060 rb_trap_immediate = 0;\
00061 statements;\
00062 rb_trap_immediate = trap_immediate;\
00063 } while (0)
00064 #endif
00065 RUBY_EXTERN rb_atomic_t rb_trap_immediate;
00066
00067 RUBY_EXTERN int rb_prohibit_interrupt;
00068 #define DEFER_INTS (rb_prohibit_interrupt++)
00069 #define ALLOW_INTS do {\
00070 rb_prohibit_interrupt--;\
00071 CHECK_INTS;\
00072 } while (0)
00073 #define ENABLE_INTS (rb_prohibit_interrupt--)
00074
00075 VALUE rb_with_disable_interrupt (VALUE(*(ANYARGS),VALUE));
00076
00077 RUBY_EXTERN rb_atomic_t rb_trap_pending;
00078 void rb_trap_restore_mask (void);
00079
00080 RUBY_EXTERN int rb_thread_critical;
00081 void rb_thread_schedule (void);
00082 #if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE)
00083 RUBY_EXTERN int rb_thread_pending;
00084 # define CHECK_INTS do {\
00085 if (!(rb_prohibit_interrupt || rb_thread_critical)) {\
00086 if (rb_thread_pending) rb_thread_schedule();\
00087 if (rb_trap_pending) rb_trap_exec();\
00088 }\
00089 } while (0)
00090 #else
00091
00092 RUBY_EXTERN int rb_thread_tick;
00093 #define THREAD_TICK 500
00094 #define CHECK_INTS do {\
00095 if (!(rb_prohibit_interrupt || rb_thread_critical)) {\
00096 if (rb_thread_tick-- <= 0) {\
00097 rb_thread_tick = THREAD_TICK;\
00098 rb_thread_schedule();\
00099 }\
00100 }\
00101 if (rb_trap_pending) rb_trap_exec();\
00102 } while (0)
00103 #endif
00104
00105 #endif
00106