diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-01-02 17:46:02 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-01-02 17:46:02 +0000 |
commit | 660fc730730aa4b567f2065363bb33d03105f9e1 (patch) | |
tree | 906f911a84793e8a665d6e1b5c5c6c18d1be0844 | |
parent | f2f16d2b2a069d42cf0229fd38000e7a83b0748f (diff) | |
download | ruby-660fc730730aa4b567f2065363bb33d03105f9e1.tar.gz ruby-660fc730730aa4b567f2065363bb33d03105f9e1.tar.xz ruby-660fc730730aa4b567f2065363bb33d03105f9e1.zip |
* rubysig.h (TRAP_END): preserve errno before switching context.
[ruby-core:02137]
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@5366 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | rubysig.h | 13 |
2 files changed, 15 insertions, 3 deletions
@@ -1,3 +1,8 @@ +Sat Jan 3 02:44:48 2004 Yukihiro Matsumoto <matz@ruby-lang.org> + + * rubysig.h (TRAP_END): preserve errno before switching context. + [ruby-core:02137] + Sat Jan 3 01:18:08 2004 Yukihiro Matsumoto <matz@ruby-lang.org> * dir.c: merge tuning from H.Yamamoto <ocean@m2.ccsnet.ne.jp>. @@ -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 {\ |