From c54e671a14cee32fda44412e59d676e490680b9b Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Fri, 21 Jul 2017 08:51:15 -0600 Subject: [PATCH] change sigset() and signal() to sigaction() The sigaction() API is the more modern, more portable one. --- racket/src/racket/include/mzwin.def | 1 + racket/src/racket/include/mzwin3m.def | 1 + racket/src/racket/include/racket.exp | 1 + racket/src/racket/include/racket3m.exp | 1 + racket/src/racket/include/scheme.h | 12 ++++----- racket/src/racket/main.c | 18 +++---------- racket/src/racket/sconfig.h | 36 -------------------------- racket/src/racket/src/number.c | 2 +- racket/src/racket/src/port.c | 9 ++----- racket/src/racket/src/salloc.c | 14 ++++++++++ racket/src/racket/src/schemef.h | 2 ++ racket/src/racket/src/schemex.h | 1 + racket/src/racket/src/schemex.inc | 1 + racket/src/racket/src/schemexm.h | 1 + racket/src/rktio/rktio_platform.h | 6 ----- racket/src/rktio/rktio_process.c | 21 ++++++++++----- 16 files changed, 49 insertions(+), 78 deletions(-) diff --git a/racket/src/racket/include/mzwin.def b/racket/src/racket/include/mzwin.def index a58224a04c..22673bc4a5 100644 --- a/racket/src/racket/include/mzwin.def +++ b/racket/src/racket/include/mzwin.def @@ -645,3 +645,4 @@ EXPORTS scheme_free_key scheme_jit_find_code_end scheme_jit_now + scheme_set_signal_handler diff --git a/racket/src/racket/include/mzwin3m.def b/racket/src/racket/include/mzwin3m.def index 55d45217a8..888c0ae396 100644 --- a/racket/src/racket/include/mzwin3m.def +++ b/racket/src/racket/include/mzwin3m.def @@ -660,3 +660,4 @@ EXPORTS scheme_free_key scheme_jit_find_code_end scheme_jit_now + scheme_set_signal_handler diff --git a/racket/src/racket/include/racket.exp b/racket/src/racket/include/racket.exp index f94b2f41b9..cc42bcbeee 100644 --- a/racket/src/racket/include/racket.exp +++ b/racket/src/racket/include/racket.exp @@ -661,3 +661,4 @@ scheme_malloc_key scheme_free_key scheme_jit_find_code_end scheme_jit_now +scheme_set_signal_handler diff --git a/racket/src/racket/include/racket3m.exp b/racket/src/racket/include/racket3m.exp index 0f9375de15..36d2dcfd82 100644 --- a/racket/src/racket/include/racket3m.exp +++ b/racket/src/racket/include/racket3m.exp @@ -667,3 +667,4 @@ scheme_malloc_key scheme_free_key scheme_jit_find_code_end scheme_jit_now +scheme_set_signal_handler diff --git a/racket/src/racket/include/scheme.h b/racket/src/racket/include/scheme.h index 25d19342a3..e5f59d229d 100644 --- a/racket/src/racket/include/scheme.h +++ b/racket/src/racket/include/scheme.h @@ -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 */ /*========================================================================*/ diff --git a/racket/src/racket/main.c b/racket/src/racket/main.c index 6a9d05e7a5..9b33b10050 100644 --- a/racket/src/racket/main.c +++ b/racket/src/racket/main.c @@ -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 diff --git a/racket/src/racket/sconfig.h b/racket/src/racket/sconfig.h index 0065d1470b..39ba54a7eb 100644 --- a/racket/src/racket/sconfig.h +++ b/racket/src/racket/sconfig.h @@ -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. */ diff --git a/racket/src/racket/src/number.c b/racket/src/racket/src/number.c index 41516276a0..edf66668a4 100644 --- a/racket/src/racket/src/number.c +++ b/racket/src/racket/src/number.c @@ -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); diff --git a/racket/src/racket/src/port.c b/racket/src/racket/src/port.c index 152c312561..45e9068cd4 100644 --- a/racket/src/racket/src/port.c +++ b/racket/src/racket/src/port.c @@ -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; diff --git a/racket/src/racket/src/salloc.c b/racket/src/racket/src/salloc.c index c6ae86bc51..c0a5f5b9b8 100644 --- a/racket/src/racket/src/salloc.c +++ b/racket/src/racket/src/salloc.c @@ -32,6 +32,9 @@ #include #include "schgc.h" #include "schrktio.h" +#ifndef WINDOWS_PROCESSES +# include +#endif #ifdef DOS_FAR_POINTERS # include @@ -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 */ /************************************************************************/ diff --git a/racket/src/racket/src/schemef.h b/racket/src/racket/src/schemef.h index 582ca7e7ea..697cfbe99d 100644 --- a/racket/src/racket/src/schemef.h +++ b/racket/src/racket/src/schemef.h @@ -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); diff --git a/racket/src/racket/src/schemex.h b/racket/src/racket/src/schemex.h index 85a8eaf689..866e1d519e 100644 --- a/racket/src/racket/src/schemex.h +++ b/racket/src/racket/src/schemex.h @@ -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 diff --git a/racket/src/racket/src/schemex.inc b/racket/src/racket/src/schemex.inc index 88383cf472..ee13468915 100644 --- a/racket/src/racket/src/schemex.inc +++ b/racket/src/racket/src/schemex.inc @@ -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; diff --git a/racket/src/racket/src/schemexm.h b/racket/src/racket/src/schemexm.h index 51b8638441..c66d4cc5b1 100644 --- a/racket/src/racket/src/schemexm.h +++ b/racket/src/racket/src/schemexm.h @@ -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 diff --git a/racket/src/rktio/rktio_platform.h b/racket/src/rktio/rktio_platform.h index 1f10464bee..5884f3efc8 100644 --- a/racket/src/rktio/rktio_platform.h +++ b/racket/src/rktio/rktio_platform.h @@ -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 diff --git a/racket/src/rktio/rktio_process.c b/racket/src/rktio/rktio_process.c index fee1dae5c5..6af69e76c3 100644 --- a/racket/src/rktio/rktio_process.c +++ b/racket/src/rktio/rktio_process.c @@ -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; }