1 | /**********************************************************************
|
---|
2 |
|
---|
3 | rubysig.h -
|
---|
4 |
|
---|
5 | $Author: shyouhei $
|
---|
6 | $Date: 2007-02-13 08:01:19 +0900 (Tue, 13 Feb 2007) $
|
---|
7 | created at: Wed Aug 16 01:15:38 JST 1995
|
---|
8 |
|
---|
9 | Copyright (C) 1993-2003 Yukihiro Matsumoto
|
---|
10 |
|
---|
11 | **********************************************************************/
|
---|
12 |
|
---|
13 | #ifndef SIG_H
|
---|
14 | #define SIG_H
|
---|
15 | #include <errno.h>
|
---|
16 |
|
---|
17 | #ifdef _WIN32
|
---|
18 | typedef LONG rb_atomic_t;
|
---|
19 |
|
---|
20 | # define ATOMIC_TEST(var) InterlockedExchange(&(var), 0)
|
---|
21 | # define ATOMIC_SET(var, val) InterlockedExchange(&(var), (val))
|
---|
22 | # define ATOMIC_INC(var) InterlockedIncrement(&(var))
|
---|
23 | # define ATOMIC_DEC(var) InterlockedDecrement(&(var))
|
---|
24 |
|
---|
25 | /* Windows doesn't allow interrupt while system calls */
|
---|
26 | # define TRAP_BEG do {\
|
---|
27 | int saved_errno = 0;\
|
---|
28 | rb_atomic_t trap_immediate = ATOMIC_SET(rb_trap_immediate, 1)
|
---|
29 | # define TRAP_END\
|
---|
30 | ATOMIC_SET(rb_trap_immediate, trap_immediate);\
|
---|
31 | saved_errno = errno;\
|
---|
32 | CHECK_INTS;\
|
---|
33 | errno = saved_errno;\
|
---|
34 | } while (0)
|
---|
35 | # define RUBY_CRITICAL(statements) do {\
|
---|
36 | rb_w32_enter_critical();\
|
---|
37 | statements;\
|
---|
38 | rb_w32_leave_critical();\
|
---|
39 | } while (0)
|
---|
40 | #else
|
---|
41 | typedef int rb_atomic_t;
|
---|
42 |
|
---|
43 | # define ATOMIC_TEST(var) ((var) ? ((var) = 0, 1) : 0)
|
---|
44 | # define ATOMIC_SET(var, val) ((var) = (val))
|
---|
45 | # define ATOMIC_INC(var) (++(var))
|
---|
46 | # define ATOMIC_DEC(var) (--(var))
|
---|
47 |
|
---|
48 | # define TRAP_BEG do {\
|
---|
49 | int saved_errno = 0;\
|
---|
50 | int trap_immediate = rb_trap_immediate;\
|
---|
51 | rb_trap_immediate = 1
|
---|
52 | # define TRAP_END rb_trap_immediate = trap_immediate;\
|
---|
53 | saved_errno = errno;\
|
---|
54 | CHECK_INTS;\
|
---|
55 | errno = saved_errno;\
|
---|
56 | } while (0)
|
---|
57 |
|
---|
58 | # define RUBY_CRITICAL(statements) do {\
|
---|
59 | int trap_immediate = rb_trap_immediate;\
|
---|
60 | rb_trap_immediate = 0;\
|
---|
61 | statements;\
|
---|
62 | rb_trap_immediate = trap_immediate;\
|
---|
63 | } while (0)
|
---|
64 | #endif
|
---|
65 | RUBY_EXTERN rb_atomic_t rb_trap_immediate;
|
---|
66 |
|
---|
67 | RUBY_EXTERN int rb_prohibit_interrupt;
|
---|
68 | #define DEFER_INTS (rb_prohibit_interrupt++)
|
---|
69 | #define ALLOW_INTS do {\
|
---|
70 | rb_prohibit_interrupt--;\
|
---|
71 | CHECK_INTS;\
|
---|
72 | } while (0)
|
---|
73 | #define ENABLE_INTS (rb_prohibit_interrupt--)
|
---|
74 |
|
---|
75 | VALUE rb_with_disable_interrupt _((VALUE(*)(ANYARGS),VALUE));
|
---|
76 |
|
---|
77 | RUBY_EXTERN rb_atomic_t rb_trap_pending;
|
---|
78 | void rb_trap_restore_mask _((void));
|
---|
79 |
|
---|
80 | RUBY_EXTERN int rb_thread_critical;
|
---|
81 | void rb_thread_schedule _((void));
|
---|
82 | #if defined(HAVE_SETITIMER) || defined(_THREAD_SAFE)
|
---|
83 | RUBY_EXTERN int rb_thread_pending;
|
---|
84 | # define CHECK_INTS do {\
|
---|
85 | if (!(rb_prohibit_interrupt || rb_thread_critical)) {\
|
---|
86 | if (rb_thread_pending) rb_thread_schedule();\
|
---|
87 | if (rb_trap_pending) rb_trap_exec();\
|
---|
88 | }\
|
---|
89 | } while (0)
|
---|
90 | #else
|
---|
91 | /* pseudo preemptive thread switching */
|
---|
92 | RUBY_EXTERN int rb_thread_tick;
|
---|
93 | #define THREAD_TICK 500
|
---|
94 | #define CHECK_INTS do {\
|
---|
95 | if (!(rb_prohibit_interrupt || rb_thread_critical)) {\
|
---|
96 | if (rb_thread_tick-- <= 0) {\
|
---|
97 | rb_thread_tick = THREAD_TICK;\
|
---|
98 | rb_thread_schedule();\
|
---|
99 | }\
|
---|
100 | }\
|
---|
101 | if (rb_trap_pending) rb_trap_exec();\
|
---|
102 | } while (0)
|
---|
103 | #endif
|
---|
104 |
|
---|
105 | #endif
|
---|