change sigset() and signal() to sigaction()

The sigaction() API is the more modern, more portable one.
This commit is contained in:
Matthew Flatt 2017-07-21 08:51:15 -06:00
parent 37006520d3
commit c54e671a14
16 changed files with 49 additions and 78 deletions

View File

@ -645,3 +645,4 @@ EXPORTS
scheme_free_key
scheme_jit_find_code_end
scheme_jit_now
scheme_set_signal_handler

View File

@ -660,3 +660,4 @@ EXPORTS
scheme_free_key
scheme_jit_find_code_end
scheme_jit_now
scheme_set_signal_handler

View File

@ -661,3 +661,4 @@ scheme_malloc_key
scheme_free_key
scheme_jit_find_code_end
scheme_jit_now
scheme_set_signal_handler

View File

@ -667,3 +667,4 @@ scheme_malloc_key
scheme_free_key
scheme_jit_find_code_end
scheme_jit_now
scheme_set_signal_handler

View File

@ -151,12 +151,6 @@ typedef long FILE;
# define MSCBOR_IZE(x) MSC_IZE(x)
#endif
#ifdef SIGSET_IS_SIGNAL
# define MZ_SIGSET(s, f) signal(s, f)
#else
# define MZ_SIGSET(s, f) sigset(s, f)
#endif
/* C99 allows an array in a struct to be declared
with [] to indicate that its actual size can be
any number. The old way was to declare the array
@ -2035,6 +2029,12 @@ MZ_EXTERN Scheme_Object *scheme_register_parameter(Scheme_Prim *function, char *
#endif /* SCHEME_DIRECT_EMBEDDED */
/*========================================================================*/
/* OS signals */
/*========================================================================*/
typedef void (*Scheme_Signal_Handler_Proc)(int);
/*========================================================================*/
/* addrinfo */
/*========================================================================*/

View File

@ -236,10 +236,6 @@ static void user_break_hit(int ignore)
{
scheme_break_main_thread_at(break_handle);
scheme_signal_received_at(signal_handle);
# ifdef SIGSET_NEEDS_REINSTALL
MZ_SIGSET(SIGINT, user_break_hit);
# endif
}
# ifndef NO_SIGTERM_HANDLER
@ -248,10 +244,6 @@ static void term_hit(int ignore)
{
scheme_break_kind_main_thread_at(break_handle, MZEXN_BREAK_TERMINATE);
scheme_signal_received_at(signal_handle);
# ifdef SIGSET_NEEDS_REINSTALL
MZ_SIGSET(SIGTERM, term_hit);
# endif
}
# endif
@ -261,10 +253,6 @@ static void hup_hit(int ignore)
{
scheme_break_kind_main_thread_at(break_handle, MZEXN_BREAK_HANG_UP);
scheme_signal_received_at(signal_handle);
# ifdef SIGSET_NEEDS_REINSTALL
MZ_SIGSET(SIGHUP, hup_hit);
# endif
}
# endif
@ -438,12 +426,12 @@ static int main_after_stack(void *data)
break_handle = scheme_get_main_thread_break_handle();
signal_handle = scheme_get_signal_handle();
# ifndef NO_USER_BREAK_HANDLER
MZ_SIGSET(SIGINT, user_break_hit);
scheme_set_signal_handler(SIGINT, user_break_hit);
# ifndef NO_SIGTERM_HANDLER
MZ_SIGSET(SIGTERM, term_hit);
scheme_set_signal_handler(SIGTERM, term_hit);
# endif
# ifndef NO_SIGHUP_HANDLER
MZ_SIGSET(SIGHUP, hup_hit);
scheme_set_signal_handler(SIGHUP, hup_hit);
# endif
# endif
# ifdef DOS_FILE_SYSTEM

View File

@ -40,7 +40,6 @@
# else
/* SunOS4 */
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "sparc-sunos4"
# define SIGSET_IS_SIGNAL
# define NO_STRERROR_AVAILABLE
# define USE_ON_EXIT_FOR_ATEXIT
# endif
@ -141,9 +140,6 @@
# define USE_IEEE_FP_PREDS
# define USE_EXPLICT_FP_FORM_CHECK
# define SIGSET_IS_SIGNAL
# define SIGSET_NEEDS_REINSTALL
# define LINUX_FIND_STACK_BASE
# define FLAGS_ALREADY_SET
@ -189,8 +185,6 @@
# define USE_IEEE_FP_PREDS
# define SIGSET_IS_SIGNAL
#if defined(__alpha__)
# define USE_DIVIDE_MAKE_INFINITY
#endif
@ -253,8 +247,6 @@
# define USE_IEEE_FP_PREDS
# define SIGSET_IS_SIGNAL
# define USE_MAP_ANON
# if defined(__x86_64__)
@ -310,8 +302,6 @@
# define USE_IEEE_FP_PREDS
# define SIGSET_IS_SIGNAL
# define USE_MAP_ANON
# if defined(__x86_64__)
@ -376,8 +366,6 @@
# define USE_IEEE_FP_PREDS
# define SIGSET_IS_SIGNAL
# define MZ_JIT_USE_MPROTECT
# define FLAGS_ALREADY_SET
@ -533,8 +521,6 @@
# define USE_WIN32_THREAD_TIMER
# endif
# define SIGSET_IS_SIGNAL
# define SIGSET_NEEDS_REINSTALL
# define NO_SIGHUP_HANDLER
#define PRINTF_INTPTR_SIZE_PREFIX "I"
@ -601,9 +587,6 @@
# undef USE_ITIMER
# define SIGSET_IS_SIGNAL
# define SIGSET_NEEDS_REINSTALL
# define USE_MZ_CYGWIN_SETJMP
# define USE_MZ_SETJMP
@ -665,8 +648,6 @@
# define USE_IEEE_FP_PREDS
# define TRIG_ZERO_NEEDS_SIGN_CHECK
# define SIGSET_IS_SIGNAL
# define USE_UNDERSCORE_SETJMP
#ifndef XONX
@ -710,8 +691,6 @@
# define USE_MAP_ANON
# define SIGSET_IS_SIGNAL
# define USE_UNDERSCORE_SETJMP
# define MZ_USE_JIT_I386
@ -730,8 +709,6 @@
# define ASSUME_FIXED_STACK_SIZE
# include "uconfig.h"
# define SIGSET_IS_SIGNAL
# define SIGSET_NEEDS_REINSTALL
# define FIXED_STACK_SIZE 524288
@ -783,8 +760,6 @@
# define POW_HANDLES_INF_CORRECTLY
# endif
# define SIGSET_IS_SIGNAL
# define MZ_JIT_USE_MPROTECT
# define FLAGS_ALREADY_SET
@ -800,8 +775,6 @@
/* assume generic Unix: */
#include "uconfig.h"
# define SIGSET_IS_SIGNAL
# define SIGSET_NEEDS_REINSTALL
/*********************/
/* Operating System */
@ -868,15 +841,6 @@
/* USE_PTHREAD_THREAD_TIMER uses a background pthread to implement
tread pre-emption. */
/* SIGSET_IS_SIGNAL uses signal() in place of sigset() for Unix. This
flag is often paired with SIGSET_NEEDS_REINSTALL for traditional
Unix systems. */
/* SIGSET_NEEDS_REINSTALL reinstalls a signal handler when it
is called to handle a signal. The expected semantics of sigset()
(when this flags is not defined) is that a signal handler is NOT
reset to SIG_DFL after a handler is called to handle a signal. */
/* DONT_IGNORE_FPE_SIGNAL stops Racket from ignoring floating-point
exception signals. */

View File

@ -301,7 +301,7 @@ void scheme_configure_floating_point(void)
/* can be called in any thread */
{
#ifndef DONT_IGNORE_FPE_SIGNAL
MZ_SIGSET(SIGFPE, SIG_IGN);
scheme_set_signal_handler(SIGFPE, NULL);
#endif
#ifdef FREEBSD_CONTROL_387
(void)fpsetmask(0);

View File

@ -346,9 +346,7 @@ scheme_init_port (Scheme_Env *env)
REGISTER_SO(scheme_redirect_output_port_type);
#ifndef DONT_IGNORE_PIPE_SIGNAL
START_XFORM_SKIP;
MZ_SIGSET(SIGPIPE, SIG_IGN);
END_XFORM_SKIP;
scheme_set_signal_handler(SIGPIPE, NULL);
#endif
if (!scheme_sleep)
@ -6523,9 +6521,6 @@ static void itimer_expired(int ignored)
{
scheme_fuel_counter = 0;
scheme_jit_stack_boundary = (uintptr_t)-1;
# ifdef SIGSET_NEEDS_REINSTALL
MZ_SIGSET(SIGPROF, itimer_expired);
# endif
}
static void kickoff_itimer(intptr_t usec)
@ -6537,7 +6532,7 @@ static void kickoff_itimer(intptr_t usec)
if (!itimer_handler_installed) {
itimer_handler_installed = 1;
MZ_SIGSET(SIGPROF, itimer_expired);
scheme_set_signal_handler(SIGPROF, itimer_expired);
}
t.it_value.tv_sec = 0;

View File

@ -32,6 +32,9 @@
#include <string.h>
#include "schgc.h"
#include "schrktio.h"
#ifndef WINDOWS_PROCESSES
# include <signal.h>
#endif
#ifdef DOS_FAR_POINTERS
# include <alloc.h>
@ -445,6 +448,17 @@ int scheme_is_place_main_os_thread() XFORM_SKIP_PROC
return 1;
}
void scheme_set_signal_handler(int sig_id, Scheme_Signal_Handler_Proc proc) XFORM_SKIP_PROC
{
#ifndef WINDOWS_PROCESSES
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = (proc ? proc : SIG_IGN);
sigaction(sig_id, &sa, NULL);
#endif
}
/************************************************************************/
/* memory utils */
/************************************************************************/

View File

@ -1232,3 +1232,5 @@ MZ_EXTERN void scheme_free_key(Scheme_Object *k);
MZ_EXTERN void *scheme_jit_find_code_end(void *p);
MZ_EXTERN void scheme_jit_now(Scheme_Object *f);
MZ_EXTERN void scheme_set_signal_handler(int sig_id, Scheme_Signal_Handler_Proc proc);

View File

@ -1005,6 +1005,7 @@ Scheme_Object *(*scheme_malloc_key)(void);
void (*scheme_free_key)(Scheme_Object *k);
void *(*scheme_jit_find_code_end)(void *p);
void (*scheme_jit_now)(Scheme_Object *f);
void (*scheme_set_signal_handler)(int sig_id, Scheme_Signal_Handler_Proc proc);
#ifndef SCHEME_EX_INLINE
} Scheme_Extension_Table;
#endif

View File

@ -729,3 +729,4 @@
scheme_extension_table->scheme_free_key = scheme_free_key;
scheme_extension_table->scheme_jit_find_code_end = scheme_jit_find_code_end;
scheme_extension_table->scheme_jit_now = scheme_jit_now;
scheme_extension_table->scheme_set_signal_handler = scheme_set_signal_handler;

View File

@ -729,6 +729,7 @@
#define scheme_free_key (scheme_extension_table->scheme_free_key)
#define scheme_jit_find_code_end (scheme_extension_table->scheme_jit_find_code_end)
#define scheme_jit_now (scheme_extension_table->scheme_jit_now)
#define scheme_set_signal_handler (scheme_extension_table->scheme_set_signal_handler)
#ifdef MZ_PRECISE_GC
#pragma GC_VARIABLE_STACK_THOUGH_TABLE
#endif

View File

@ -15,7 +15,6 @@
# define USE_TIMEZONE_AND_ALTZONE_VAR
# define USE_TZNAME_VAR
# define USE_NULL_TO_DISCONNECT_UDP
# define SIGNAL_NEEDS_REINSTALL
# else
/* SunOS4 */
# define USE_TM_GMTOFF_FIELD
@ -333,11 +332,6 @@
/* Signals */
/***********************/
/* SIGNAL_NEEDS_REINSTALL reinstalls a signal handler when it
is called to handle a signal. The expected semantics of signal()
(when this flags is not defined) is that a signal handler is NOT
reset to SIG_DFL after a handler is called to handle a signal. */
/* USE_CREATE_PIPE uses CreatePipe() instead of _pipe() for Windows. */
/* SIGCHILD_DOESNT_INTERRUPT_SELECT indicates that the SIGCHILD

View File

@ -36,10 +36,11 @@ struct rktio_process_t {
};
/*========================================================================*/
/* Status helper */
/* Status and signal helpers */
/*========================================================================*/
#if defined(RKTIO_SYSTEM_UNIX)
static int extract_child_status(int status)
{
if (WIFEXITED(status))
@ -51,6 +52,16 @@ static int extract_child_status(int status)
return status;
}
static void set_signal_handler(int sig_id, void (*proc)(int))
{
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = proc;
sigaction(sig_id, &sa, NULL);
}
#endif
/*========================================================================*/
@ -422,7 +433,7 @@ void centralized_starting_child()
does not block SIGCHLD.
Solaris, meanwhile, seems to unmask SIGCHLD as a result of
setting a handler, so do this before masking the signal. */
signal(SIGCHLD, got_sigchld);
set_signal_handler(SIGCHLD, got_sigchld);
/* Block SIGCLHD (again), because the worker thread will use sigwait(). */
block_sigchld();
@ -568,17 +579,13 @@ static void child_done(int ingored)
rktio_signal_received(rktio);
rktio = rktio->next;
}
# ifdef SIGNAL_NEEDS_REINSTALL
signal(SIGCHLD, child_done);
# endif
}
static void init_sigchld(rktio_t *rktio)
{
#if !defined(CENTRALIZED_SIGCHILD)
if (!sigchld_installed) {
signal(SIGCHLD, child_done);
set_signal_handler(SIGCHLD, child_done);
sigchld_installed = 1;
}