From 88fb246cc7944b7feb5585a4f4ac3248df4b7770 Mon Sep 17 00:00:00 2001 From: matz Date: Fri, 2 Jan 2004 17:46:02 +0000 Subject: * 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 --- rubysig.h | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'rubysig.h') 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 {\ -- cgit v1.2.3