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
master
Jérémie Dimino 2013-05-14 15:37:48 +00:00
parent 200f97fef6
commit d69bd84bb3
2 changed files with 11 additions and 1 deletions

View File

@ -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)

View File

@ -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)