diff options
author | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-25 15:02:05 +0000 |
---|---|---|
committer | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-25 15:02:05 +0000 |
commit | 0dc342de848a642ecce8db697b8fecd83a63e117 (patch) | |
tree | 2b7ed4724aff1f86073e4740134bda9c4aac1a39 /trunk/include/ruby/signal.h | |
parent | ef70cf7138ab8034b5b806f466e4b484b24f0f88 (diff) |
added tag v1_9_0_4
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/tags/v1_9_0_4@18845 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'trunk/include/ruby/signal.h')
-rw-r--r-- | trunk/include/ruby/signal.h | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/trunk/include/ruby/signal.h b/trunk/include/ruby/signal.h new file mode 100644 index 0000000000..62a6c5d13c --- /dev/null +++ b/trunk/include/ruby/signal.h @@ -0,0 +1,92 @@ +/********************************************************************** + + rubysig.h - + + $Author$ + created at: Wed Aug 16 01:15:38 JST 1995 + + Copyright (C) 1993-2007 Yukihiro Matsumoto + +**********************************************************************/ + +#ifndef RUBYSIG_H +#define RUBYSIG_H 1 + +#if defined(__cplusplus) +extern "C" { +#if 0 +} /* satisfy cc-mode */ +#endif +#endif + +#include <errno.h> + +#ifdef _WIN32 +typedef LONG rb_atomic_t; + +# define ATOMIC_TEST(var) InterlockedExchange(&(var), 0) +# define ATOMIC_SET(var, val) InterlockedExchange(&(var), (val)) +# define ATOMIC_INC(var) InterlockedIncrement(&(var)) +# define ATOMIC_DEC(var) InterlockedDecrement(&(var)) + +/* Windows doesn't allow interrupt while system calls */ +# define TRAP_BEG do {\ + rb_atomic_t trap_immediate = ATOMIC_SET(rb_trap_immediate, 1) + +# define TRAP_END\ + ATOMIC_SET(rb_trap_immediate, trap_immediate);\ +} while (0) + +# define RUBY_CRITICAL(statements) do {\ + rb_atomic_t trap_immediate = ATOMIC_SET(rb_trap_immediate, 0);\ + statements;\ + ATOMIC_SET(rb_trap_immediate, trap_immediate);\ +} while (0) +#else +typedef int rb_atomic_t; + +# define ATOMIC_TEST(var) ((var) ? ((var) = 0, 1) : 0) +# define ATOMIC_SET(var, val) ((var) = (val)) +# define ATOMIC_INC(var) (++(var)) +# define ATOMIC_DEC(var) (--(var)) + +# define TRAP_BEG do {\ + int trap_immediate = rb_trap_immediate;\ + rb_trap_immediate = 1 + +# define TRAP_END \ + rb_trap_immediate = trap_immediate;\ +} while (0) + +# define RUBY_CRITICAL(statements) do {\ + int trap_immediate = rb_trap_immediate;\ + rb_trap_immediate = 0;\ + statements;\ + rb_trap_immediate = trap_immediate;\ +} while (0) +#endif +RUBY_EXTERN rb_atomic_t rb_trap_immediate; + +RUBY_EXTERN int rb_prohibit_interrupt; +#define DEFER_INTS (rb_prohibit_interrupt++) +#define ALLOW_INTS do {\ + rb_prohibit_interrupt--;\ +} while (0) +#define ENABLE_INTS (rb_prohibit_interrupt--) + +VALUE rb_with_disable_interrupt(VALUE(*)(ANYARGS),VALUE); + +RUBY_EXTERN rb_atomic_t rb_trap_pending; +void rb_trap_restore_mask(void); + +RUBY_EXTERN int rb_thread_critical; +void rb_thread_schedule(void); + +#if defined(__cplusplus) +#if 0 +{ /* satisfy cc-mode */ +#endif +} /* extern "C" { */ +#endif + +#endif /* RUBYSIG_H */ |