Main Page | Modules | Alphabetical List | Data Structures | File List | Data Fields | Globals

rubysig.h

Go to the documentation of this file.
00001 /**********************************************************************
00002 
00003   rubysig.h -
00004 
00005   $Author: ocean $
00006   $Date: 2005/10/21 10:23:03 $
00007   created at: Wed Aug 16 01:15:38 JST 1995
00008 
00009   Copyright (C) 1993-2003 Yukihiro Matsumoto
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 /* Windows doesn't allow interrupt while system calls */
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 /* pseudo preemptive thread switching */
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 

Generated on Wed Jan 18 23:32:06 2006 for Ruby by doxygen 1.3.5