change sigset() and signal() to sigaction()
The sigaction() API is the more modern, more portable one.
This commit is contained in:
parent
37006520d3
commit
c54e671a14
|
@ -645,3 +645,4 @@ EXPORTS
|
|||
scheme_free_key
|
||||
scheme_jit_find_code_end
|
||||
scheme_jit_now
|
||||
scheme_set_signal_handler
|
||||
|
|
|
@ -660,3 +660,4 @@ EXPORTS
|
|||
scheme_free_key
|
||||
scheme_jit_find_code_end
|
||||
scheme_jit_now
|
||||
scheme_set_signal_handler
|
||||
|
|
|
@ -661,3 +661,4 @@ scheme_malloc_key
|
|||
scheme_free_key
|
||||
scheme_jit_find_code_end
|
||||
scheme_jit_now
|
||||
scheme_set_signal_handler
|
||||
|
|
|
@ -667,3 +667,4 @@ scheme_malloc_key
|
|||
scheme_free_key
|
||||
scheme_jit_find_code_end
|
||||
scheme_jit_now
|
||||
scheme_set_signal_handler
|
||||
|
|
|
@ -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 */
|
||||
/*========================================================================*/
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
/************************************************************************/
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user