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_free_key
|
||||||
scheme_jit_find_code_end
|
scheme_jit_find_code_end
|
||||||
scheme_jit_now
|
scheme_jit_now
|
||||||
|
scheme_set_signal_handler
|
||||||
|
|
|
@ -660,3 +660,4 @@ EXPORTS
|
||||||
scheme_free_key
|
scheme_free_key
|
||||||
scheme_jit_find_code_end
|
scheme_jit_find_code_end
|
||||||
scheme_jit_now
|
scheme_jit_now
|
||||||
|
scheme_set_signal_handler
|
||||||
|
|
|
@ -661,3 +661,4 @@ scheme_malloc_key
|
||||||
scheme_free_key
|
scheme_free_key
|
||||||
scheme_jit_find_code_end
|
scheme_jit_find_code_end
|
||||||
scheme_jit_now
|
scheme_jit_now
|
||||||
|
scheme_set_signal_handler
|
||||||
|
|
|
@ -667,3 +667,4 @@ scheme_malloc_key
|
||||||
scheme_free_key
|
scheme_free_key
|
||||||
scheme_jit_find_code_end
|
scheme_jit_find_code_end
|
||||||
scheme_jit_now
|
scheme_jit_now
|
||||||
|
scheme_set_signal_handler
|
||||||
|
|
|
@ -151,12 +151,6 @@ typedef long FILE;
|
||||||
# define MSCBOR_IZE(x) MSC_IZE(x)
|
# define MSCBOR_IZE(x) MSC_IZE(x)
|
||||||
#endif
|
#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
|
/* C99 allows an array in a struct to be declared
|
||||||
with [] to indicate that its actual size can be
|
with [] to indicate that its actual size can be
|
||||||
any number. The old way was to declare the array
|
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 */
|
#endif /* SCHEME_DIRECT_EMBEDDED */
|
||||||
|
|
||||||
|
/*========================================================================*/
|
||||||
|
/* OS signals */
|
||||||
|
/*========================================================================*/
|
||||||
|
|
||||||
|
typedef void (*Scheme_Signal_Handler_Proc)(int);
|
||||||
|
|
||||||
/*========================================================================*/
|
/*========================================================================*/
|
||||||
/* addrinfo */
|
/* addrinfo */
|
||||||
/*========================================================================*/
|
/*========================================================================*/
|
||||||
|
|
|
@ -236,10 +236,6 @@ static void user_break_hit(int ignore)
|
||||||
{
|
{
|
||||||
scheme_break_main_thread_at(break_handle);
|
scheme_break_main_thread_at(break_handle);
|
||||||
scheme_signal_received_at(signal_handle);
|
scheme_signal_received_at(signal_handle);
|
||||||
|
|
||||||
# ifdef SIGSET_NEEDS_REINSTALL
|
|
||||||
MZ_SIGSET(SIGINT, user_break_hit);
|
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifndef NO_SIGTERM_HANDLER
|
# 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_break_kind_main_thread_at(break_handle, MZEXN_BREAK_TERMINATE);
|
||||||
scheme_signal_received_at(signal_handle);
|
scheme_signal_received_at(signal_handle);
|
||||||
|
|
||||||
# ifdef SIGSET_NEEDS_REINSTALL
|
|
||||||
MZ_SIGSET(SIGTERM, term_hit);
|
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
# 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_break_kind_main_thread_at(break_handle, MZEXN_BREAK_HANG_UP);
|
||||||
scheme_signal_received_at(signal_handle);
|
scheme_signal_received_at(signal_handle);
|
||||||
|
|
||||||
# ifdef SIGSET_NEEDS_REINSTALL
|
|
||||||
MZ_SIGSET(SIGHUP, hup_hit);
|
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
@ -438,12 +426,12 @@ static int main_after_stack(void *data)
|
||||||
break_handle = scheme_get_main_thread_break_handle();
|
break_handle = scheme_get_main_thread_break_handle();
|
||||||
signal_handle = scheme_get_signal_handle();
|
signal_handle = scheme_get_signal_handle();
|
||||||
# ifndef NO_USER_BREAK_HANDLER
|
# ifndef NO_USER_BREAK_HANDLER
|
||||||
MZ_SIGSET(SIGINT, user_break_hit);
|
scheme_set_signal_handler(SIGINT, user_break_hit);
|
||||||
# ifndef NO_SIGTERM_HANDLER
|
# ifndef NO_SIGTERM_HANDLER
|
||||||
MZ_SIGSET(SIGTERM, term_hit);
|
scheme_set_signal_handler(SIGTERM, term_hit);
|
||||||
# endif
|
# endif
|
||||||
# ifndef NO_SIGHUP_HANDLER
|
# ifndef NO_SIGHUP_HANDLER
|
||||||
MZ_SIGSET(SIGHUP, hup_hit);
|
scheme_set_signal_handler(SIGHUP, hup_hit);
|
||||||
# endif
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# ifdef DOS_FILE_SYSTEM
|
# ifdef DOS_FILE_SYSTEM
|
||||||
|
|
|
@ -40,7 +40,6 @@
|
||||||
# else
|
# else
|
||||||
/* SunOS4 */
|
/* SunOS4 */
|
||||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "sparc-sunos4"
|
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "sparc-sunos4"
|
||||||
# define SIGSET_IS_SIGNAL
|
|
||||||
# define NO_STRERROR_AVAILABLE
|
# define NO_STRERROR_AVAILABLE
|
||||||
# define USE_ON_EXIT_FOR_ATEXIT
|
# define USE_ON_EXIT_FOR_ATEXIT
|
||||||
# endif
|
# endif
|
||||||
|
@ -141,9 +140,6 @@
|
||||||
# define USE_IEEE_FP_PREDS
|
# define USE_IEEE_FP_PREDS
|
||||||
# define USE_EXPLICT_FP_FORM_CHECK
|
# define USE_EXPLICT_FP_FORM_CHECK
|
||||||
|
|
||||||
# define SIGSET_IS_SIGNAL
|
|
||||||
# define SIGSET_NEEDS_REINSTALL
|
|
||||||
|
|
||||||
# define LINUX_FIND_STACK_BASE
|
# define LINUX_FIND_STACK_BASE
|
||||||
|
|
||||||
# define FLAGS_ALREADY_SET
|
# define FLAGS_ALREADY_SET
|
||||||
|
@ -189,8 +185,6 @@
|
||||||
|
|
||||||
# define USE_IEEE_FP_PREDS
|
# define USE_IEEE_FP_PREDS
|
||||||
|
|
||||||
# define SIGSET_IS_SIGNAL
|
|
||||||
|
|
||||||
#if defined(__alpha__)
|
#if defined(__alpha__)
|
||||||
# define USE_DIVIDE_MAKE_INFINITY
|
# define USE_DIVIDE_MAKE_INFINITY
|
||||||
#endif
|
#endif
|
||||||
|
@ -253,8 +247,6 @@
|
||||||
|
|
||||||
# define USE_IEEE_FP_PREDS
|
# define USE_IEEE_FP_PREDS
|
||||||
|
|
||||||
# define SIGSET_IS_SIGNAL
|
|
||||||
|
|
||||||
# define USE_MAP_ANON
|
# define USE_MAP_ANON
|
||||||
|
|
||||||
# if defined(__x86_64__)
|
# if defined(__x86_64__)
|
||||||
|
@ -310,8 +302,6 @@
|
||||||
|
|
||||||
# define USE_IEEE_FP_PREDS
|
# define USE_IEEE_FP_PREDS
|
||||||
|
|
||||||
# define SIGSET_IS_SIGNAL
|
|
||||||
|
|
||||||
# define USE_MAP_ANON
|
# define USE_MAP_ANON
|
||||||
|
|
||||||
# if defined(__x86_64__)
|
# if defined(__x86_64__)
|
||||||
|
@ -376,8 +366,6 @@
|
||||||
|
|
||||||
# define USE_IEEE_FP_PREDS
|
# define USE_IEEE_FP_PREDS
|
||||||
|
|
||||||
# define SIGSET_IS_SIGNAL
|
|
||||||
|
|
||||||
# define MZ_JIT_USE_MPROTECT
|
# define MZ_JIT_USE_MPROTECT
|
||||||
|
|
||||||
# define FLAGS_ALREADY_SET
|
# define FLAGS_ALREADY_SET
|
||||||
|
@ -533,8 +521,6 @@
|
||||||
# define USE_WIN32_THREAD_TIMER
|
# define USE_WIN32_THREAD_TIMER
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# define SIGSET_IS_SIGNAL
|
|
||||||
# define SIGSET_NEEDS_REINSTALL
|
|
||||||
# define NO_SIGHUP_HANDLER
|
# define NO_SIGHUP_HANDLER
|
||||||
|
|
||||||
#define PRINTF_INTPTR_SIZE_PREFIX "I"
|
#define PRINTF_INTPTR_SIZE_PREFIX "I"
|
||||||
|
@ -601,9 +587,6 @@
|
||||||
|
|
||||||
# undef USE_ITIMER
|
# undef USE_ITIMER
|
||||||
|
|
||||||
# define SIGSET_IS_SIGNAL
|
|
||||||
# define SIGSET_NEEDS_REINSTALL
|
|
||||||
|
|
||||||
# define USE_MZ_CYGWIN_SETJMP
|
# define USE_MZ_CYGWIN_SETJMP
|
||||||
# define USE_MZ_SETJMP
|
# define USE_MZ_SETJMP
|
||||||
|
|
||||||
|
@ -665,8 +648,6 @@
|
||||||
# define USE_IEEE_FP_PREDS
|
# define USE_IEEE_FP_PREDS
|
||||||
# define TRIG_ZERO_NEEDS_SIGN_CHECK
|
# define TRIG_ZERO_NEEDS_SIGN_CHECK
|
||||||
|
|
||||||
# define SIGSET_IS_SIGNAL
|
|
||||||
|
|
||||||
# define USE_UNDERSCORE_SETJMP
|
# define USE_UNDERSCORE_SETJMP
|
||||||
|
|
||||||
#ifndef XONX
|
#ifndef XONX
|
||||||
|
@ -710,8 +691,6 @@
|
||||||
|
|
||||||
# define USE_MAP_ANON
|
# define USE_MAP_ANON
|
||||||
|
|
||||||
# define SIGSET_IS_SIGNAL
|
|
||||||
|
|
||||||
# define USE_UNDERSCORE_SETJMP
|
# define USE_UNDERSCORE_SETJMP
|
||||||
|
|
||||||
# define MZ_USE_JIT_I386
|
# define MZ_USE_JIT_I386
|
||||||
|
@ -730,8 +709,6 @@
|
||||||
# define ASSUME_FIXED_STACK_SIZE
|
# define ASSUME_FIXED_STACK_SIZE
|
||||||
|
|
||||||
# include "uconfig.h"
|
# include "uconfig.h"
|
||||||
# define SIGSET_IS_SIGNAL
|
|
||||||
# define SIGSET_NEEDS_REINSTALL
|
|
||||||
|
|
||||||
# define FIXED_STACK_SIZE 524288
|
# define FIXED_STACK_SIZE 524288
|
||||||
|
|
||||||
|
@ -783,8 +760,6 @@
|
||||||
# define POW_HANDLES_INF_CORRECTLY
|
# define POW_HANDLES_INF_CORRECTLY
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# define SIGSET_IS_SIGNAL
|
|
||||||
|
|
||||||
# define MZ_JIT_USE_MPROTECT
|
# define MZ_JIT_USE_MPROTECT
|
||||||
|
|
||||||
# define FLAGS_ALREADY_SET
|
# define FLAGS_ALREADY_SET
|
||||||
|
@ -800,8 +775,6 @@
|
||||||
|
|
||||||
/* assume generic Unix: */
|
/* assume generic Unix: */
|
||||||
#include "uconfig.h"
|
#include "uconfig.h"
|
||||||
# define SIGSET_IS_SIGNAL
|
|
||||||
# define SIGSET_NEEDS_REINSTALL
|
|
||||||
|
|
||||||
/*********************/
|
/*********************/
|
||||||
/* Operating System */
|
/* Operating System */
|
||||||
|
@ -868,15 +841,6 @@
|
||||||
/* USE_PTHREAD_THREAD_TIMER uses a background pthread to implement
|
/* USE_PTHREAD_THREAD_TIMER uses a background pthread to implement
|
||||||
tread pre-emption. */
|
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
|
/* DONT_IGNORE_FPE_SIGNAL stops Racket from ignoring floating-point
|
||||||
exception signals. */
|
exception signals. */
|
||||||
|
|
||||||
|
|
|
@ -301,7 +301,7 @@ void scheme_configure_floating_point(void)
|
||||||
/* can be called in any thread */
|
/* can be called in any thread */
|
||||||
{
|
{
|
||||||
#ifndef DONT_IGNORE_FPE_SIGNAL
|
#ifndef DONT_IGNORE_FPE_SIGNAL
|
||||||
MZ_SIGSET(SIGFPE, SIG_IGN);
|
scheme_set_signal_handler(SIGFPE, NULL);
|
||||||
#endif
|
#endif
|
||||||
#ifdef FREEBSD_CONTROL_387
|
#ifdef FREEBSD_CONTROL_387
|
||||||
(void)fpsetmask(0);
|
(void)fpsetmask(0);
|
||||||
|
|
|
@ -346,9 +346,7 @@ scheme_init_port (Scheme_Env *env)
|
||||||
REGISTER_SO(scheme_redirect_output_port_type);
|
REGISTER_SO(scheme_redirect_output_port_type);
|
||||||
|
|
||||||
#ifndef DONT_IGNORE_PIPE_SIGNAL
|
#ifndef DONT_IGNORE_PIPE_SIGNAL
|
||||||
START_XFORM_SKIP;
|
scheme_set_signal_handler(SIGPIPE, NULL);
|
||||||
MZ_SIGSET(SIGPIPE, SIG_IGN);
|
|
||||||
END_XFORM_SKIP;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!scheme_sleep)
|
if (!scheme_sleep)
|
||||||
|
@ -6523,9 +6521,6 @@ static void itimer_expired(int ignored)
|
||||||
{
|
{
|
||||||
scheme_fuel_counter = 0;
|
scheme_fuel_counter = 0;
|
||||||
scheme_jit_stack_boundary = (uintptr_t)-1;
|
scheme_jit_stack_boundary = (uintptr_t)-1;
|
||||||
# ifdef SIGSET_NEEDS_REINSTALL
|
|
||||||
MZ_SIGSET(SIGPROF, itimer_expired);
|
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void kickoff_itimer(intptr_t usec)
|
static void kickoff_itimer(intptr_t usec)
|
||||||
|
@ -6537,7 +6532,7 @@ static void kickoff_itimer(intptr_t usec)
|
||||||
|
|
||||||
if (!itimer_handler_installed) {
|
if (!itimer_handler_installed) {
|
||||||
itimer_handler_installed = 1;
|
itimer_handler_installed = 1;
|
||||||
MZ_SIGSET(SIGPROF, itimer_expired);
|
scheme_set_signal_handler(SIGPROF, itimer_expired);
|
||||||
}
|
}
|
||||||
|
|
||||||
t.it_value.tv_sec = 0;
|
t.it_value.tv_sec = 0;
|
||||||
|
|
|
@ -32,6 +32,9 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "schgc.h"
|
#include "schgc.h"
|
||||||
#include "schrktio.h"
|
#include "schrktio.h"
|
||||||
|
#ifndef WINDOWS_PROCESSES
|
||||||
|
# include <signal.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef DOS_FAR_POINTERS
|
#ifdef DOS_FAR_POINTERS
|
||||||
# include <alloc.h>
|
# include <alloc.h>
|
||||||
|
@ -445,6 +448,17 @@ int scheme_is_place_main_os_thread() XFORM_SKIP_PROC
|
||||||
return 1;
|
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 */
|
/* 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_find_code_end(void *p);
|
||||||
MZ_EXTERN void scheme_jit_now(Scheme_Object *f);
|
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_free_key)(Scheme_Object *k);
|
||||||
void *(*scheme_jit_find_code_end)(void *p);
|
void *(*scheme_jit_find_code_end)(void *p);
|
||||||
void (*scheme_jit_now)(Scheme_Object *f);
|
void (*scheme_jit_now)(Scheme_Object *f);
|
||||||
|
void (*scheme_set_signal_handler)(int sig_id, Scheme_Signal_Handler_Proc proc);
|
||||||
#ifndef SCHEME_EX_INLINE
|
#ifndef SCHEME_EX_INLINE
|
||||||
} Scheme_Extension_Table;
|
} Scheme_Extension_Table;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -729,3 +729,4 @@
|
||||||
scheme_extension_table->scheme_free_key = scheme_free_key;
|
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_find_code_end = scheme_jit_find_code_end;
|
||||||
scheme_extension_table->scheme_jit_now = scheme_jit_now;
|
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_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_find_code_end (scheme_extension_table->scheme_jit_find_code_end)
|
||||||
#define scheme_jit_now (scheme_extension_table->scheme_jit_now)
|
#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
|
#ifdef MZ_PRECISE_GC
|
||||||
#pragma GC_VARIABLE_STACK_THOUGH_TABLE
|
#pragma GC_VARIABLE_STACK_THOUGH_TABLE
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
# define USE_TIMEZONE_AND_ALTZONE_VAR
|
# define USE_TIMEZONE_AND_ALTZONE_VAR
|
||||||
# define USE_TZNAME_VAR
|
# define USE_TZNAME_VAR
|
||||||
# define USE_NULL_TO_DISCONNECT_UDP
|
# define USE_NULL_TO_DISCONNECT_UDP
|
||||||
# define SIGNAL_NEEDS_REINSTALL
|
|
||||||
# else
|
# else
|
||||||
/* SunOS4 */
|
/* SunOS4 */
|
||||||
# define USE_TM_GMTOFF_FIELD
|
# define USE_TM_GMTOFF_FIELD
|
||||||
|
@ -333,11 +332,6 @@
|
||||||
/* Signals */
|
/* 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. */
|
/* USE_CREATE_PIPE uses CreatePipe() instead of _pipe() for Windows. */
|
||||||
|
|
||||||
/* SIGCHILD_DOESNT_INTERRUPT_SELECT indicates that the SIGCHILD
|
/* 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)
|
#if defined(RKTIO_SYSTEM_UNIX)
|
||||||
|
|
||||||
static int extract_child_status(int status)
|
static int extract_child_status(int status)
|
||||||
{
|
{
|
||||||
if (WIFEXITED(status))
|
if (WIFEXITED(status))
|
||||||
|
@ -51,6 +52,16 @@ static int extract_child_status(int status)
|
||||||
|
|
||||||
return 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
|
#endif
|
||||||
|
|
||||||
/*========================================================================*/
|
/*========================================================================*/
|
||||||
|
@ -422,7 +433,7 @@ void centralized_starting_child()
|
||||||
does not block SIGCHLD.
|
does not block SIGCHLD.
|
||||||
Solaris, meanwhile, seems to unmask SIGCHLD as a result of
|
Solaris, meanwhile, seems to unmask SIGCHLD as a result of
|
||||||
setting a handler, so do this before masking the signal. */
|
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 SIGCLHD (again), because the worker thread will use sigwait(). */
|
||||||
block_sigchld();
|
block_sigchld();
|
||||||
|
@ -568,17 +579,13 @@ static void child_done(int ingored)
|
||||||
rktio_signal_received(rktio);
|
rktio_signal_received(rktio);
|
||||||
rktio = rktio->next;
|
rktio = rktio->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef SIGNAL_NEEDS_REINSTALL
|
|
||||||
signal(SIGCHLD, child_done);
|
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init_sigchld(rktio_t *rktio)
|
static void init_sigchld(rktio_t *rktio)
|
||||||
{
|
{
|
||||||
#if !defined(CENTRALIZED_SIGCHILD)
|
#if !defined(CENTRALIZED_SIGCHILD)
|
||||||
if (!sigchld_installed) {
|
if (!sigchld_installed) {
|
||||||
signal(SIGCHLD, child_done);
|
set_signal_handler(SIGCHLD, child_done);
|
||||||
sigchld_installed = 1;
|
sigchld_installed = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user