summaryrefslogtreecommitdiff
path: root/rubysig.h
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-01-02 17:46:02 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-01-02 17:46:02 +0000
commit88fb246cc7944b7feb5585a4f4ac3248df4b7770 (patch)
tree906f911a84793e8a665d6e1b5c5c6c18d1be0844 /rubysig.h
parent59dbfa3e4cc8d4705ef5a4abd9904fa523f26bfa (diff)
* rubysig.h (TRAP_END): preserve errno before switching context.
[ruby-core:02137] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@5366 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'rubysig.h')
-rw-r--r--rubysig.h13
1 files changed, 10 insertions, 3 deletions
diff --git a/rubysig.h b/rubysig.h
index 6be634787d..5b8ea45863 100644
--- a/rubysig.h
+++ b/rubysig.h
@@ -23,10 +23,13 @@ typedef LONG rb_atomic_t;
/* Windows doesn't allow interrupt while system calls */
# define TRAP_BEG do {\
+ extern int errno;\
rb_atomic_t trap_immediate = ATOMIC_SET(rb_trap_immediate, 1)
# define TRAP_END\
- ATOMIC_SET(rb_trap_immediate, trap_immediate);\
- CHECK_INTS;\
+ ATOMIC_SET(rb_trap_immediate, trap_immediate);\
+ saved_errno = errno;\
+ CHECK_INTS;\
+ errno = saved_errno;\
} while (0)
# define RUBY_CRITICAL(statements) do {\
rb_w32_enter_critical();\
@@ -42,10 +45,14 @@ typedef int rb_atomic_t;
# define ATOMIC_DEC(var) (--(var))
# define TRAP_BEG do {\
+ extern int errno;\
+ int saved_errno = 0;\
int trap_immediate = rb_trap_immediate;\
rb_trap_immediate = 1
# define TRAP_END rb_trap_immediate = trap_immediate;\
- CHECK_INTS;\
+ saved_errno = errno;\
+ CHECK_INTS;\
+ errno = saved_errno;\
} while (0)
# define RUBY_CRITICAL(statements) do {\