diff options
author | Jérémie Dimino <jeremie@dimino.org> | 2013-05-14 15:37:48 +0000 |
---|---|---|
committer | Jérémie Dimino <jeremie@dimino.org> | 2013-05-14 15:37:48 +0000 |
commit | d69bd84bb38d29795f95960afffd4bdf0d1bd723 (patch) | |
tree | eb73372b00e61148994274c6f5e5f6b448b17f6b | |
parent | 200f97fef60e6053716fdbd84f276f0d1f682242 (diff) |
PR#5982: save and restore the value of errno in signal handlers
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@13667 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r-- | asmrun/signals_asm.c | 5 | ||||
-rw-r--r-- | byterun/signals_byt.c | 7 |
2 files changed, 11 insertions, 1 deletions
diff --git a/asmrun/signals_asm.c b/asmrun/signals_asm.c index fb22f8baf..a1ef94268 100644 --- a/asmrun/signals_asm.c +++ b/asmrun/signals_asm.c @@ -17,6 +17,7 @@ #define _GNU_SOURCE #endif #include <signal.h> +#include <errno.h> #include <stdio.h> #include "fail.h" #include "memory.h" @@ -73,6 +74,9 @@ void caml_garbage_collection(void) DECLARE_SIGNAL_HANDLER(handle_signal) { + int saved_errno; + /* Save the value of errno (PR#5982). */ + saved_errno = errno; #if !defined(POSIX_SIGNALS) && !defined(BSD_SIGNALS) signal(sig, handle_signal); #endif @@ -90,6 +94,7 @@ DECLARE_SIGNAL_HANDLER(handle_signal) CONTEXT_YOUNG_LIMIT = (context_reg) caml_young_limit; #endif } + errno = saved_errno; } int caml_set_signal_action(int signo, int action) diff --git a/byterun/signals_byt.c b/byterun/signals_byt.c index cd0c0ebdf..9703afaa6 100644 --- a/byterun/signals_byt.c +++ b/byterun/signals_byt.c @@ -14,6 +14,7 @@ /* Signal handling, code specific to the bytecode interpreter */ #include <signal.h> +#include <errno.h> #include "config.h" #include "memory.h" #include "osdeps.h" @@ -49,6 +50,9 @@ void caml_process_event(void) static void handle_signal(int signal_number) { + int saved_errno; + /* Save the value of errno (PR#5982). */ + saved_errno = errno; #if !defined(POSIX_SIGNALS) && !defined(BSD_SIGNALS) signal(signal_number, handle_signal); #endif @@ -58,7 +62,8 @@ static void handle_signal(int signal_number) caml_enter_blocking_section_hook(); }else{ caml_record_signal(signal_number); - } + } + errno = saved_errno; } int caml_set_signal_action(int signo, int action) |