From ab7bb38aca0d2b5c2b81142a8e67fbff0f1a4a8a Mon Sep 17 00:00:00 2001 From: Samuel Williams Date: Mon, 15 May 2023 23:14:51 +0900 Subject: Remove explicit SIGCHLD handling. (#7816) * Remove unused SIGCHLD handling. * Remove unused `init_sigchld`. * Remove unnecessary `#define RUBY_SIGCHLD (0)`. * Remove unused `SIGCHLD_LOSSY`. --- signal.c | 82 +++++---------------------------------------------------------- thread.c | 2 +- vm_core.h | 13 ++-------- 3 files changed, 9 insertions(+), 88 deletions(-) diff --git a/signal.c b/signal.c index 2487882fdd..247f72ae8c 100644 --- a/signal.c +++ b/signal.c @@ -133,7 +133,7 @@ static const struct signals { #ifdef SIGCONT {"CONT", SIGCONT}, #endif -#if RUBY_SIGCHLD +#ifdef RUBY_SIGCHLD {"CHLD", RUBY_SIGCHLD }, {"CLD", RUBY_SIGCHLD }, #endif @@ -509,9 +509,6 @@ static struct { rb_atomic_t cnt[RUBY_NSIG]; rb_atomic_t size; } signal_buff; -#if RUBY_SIGCHLD -volatile unsigned int ruby_nocldwait; -#endif #define sighandler_t ruby_sighandler_t @@ -609,27 +606,6 @@ ruby_signal(int signum, sighandler_t handler) #endif switch (signum) { -#if RUBY_SIGCHLD - case RUBY_SIGCHLD: - if (handler == SIG_IGN) { - ruby_nocldwait = 1; -# ifdef USE_SIGALTSTACK - if (sigact.sa_flags & SA_SIGINFO) { - sigact.sa_sigaction = (ruby_sigaction_t*)sighandler; - } - else { - sigact.sa_handler = sighandler; - } -# else - sigact.sa_handler = handler; - sigact.sa_flags = 0; -# endif - } - else { - ruby_nocldwait = 0; - } - break; -#endif #if defined(SA_ONSTACK) && defined(USE_SIGALTSTACK) case SIGSEGV: #ifdef SIGBUS @@ -708,35 +684,14 @@ signal_enque(int sig) ATOMIC_INC(signal_buff.size); } -#if RUBY_SIGCHLD -static rb_atomic_t sigchld_hit; -/* destructive getter than simple predicate */ -# define GET_SIGCHLD_HIT() ATOMIC_EXCHANGE(sigchld_hit, 0) -#else -# define GET_SIGCHLD_HIT() 0 -#endif - static void sighandler(int sig) { int old_errnum = errno; - /* the VM always needs to handle SIGCHLD for rb_waitpid */ - if (sig == RUBY_SIGCHLD) { -#if RUBY_SIGCHLD - rb_vm_t *vm = GET_VM(); - ATOMIC_EXCHANGE(sigchld_hit, 1); - - /* avoid spurious wakeup in main thread if and only if nobody uses trap(:CHLD) */ - if (vm && ACCESS_ONCE(VALUE, vm->trap_list.cmd[sig])) { - signal_enque(sig); - } -#endif - } - else { - signal_enque(sig); - } + signal_enque(sig); rb_thread_wakeup_timer_thread(sig); + #if !defined(BSD_SIGNAL) && !defined(POSIX_SIGNAL) ruby_signal(sig, sighandler); #endif @@ -1152,9 +1107,6 @@ default_handler(int sig) #endif #ifdef SIGUSR2 case SIGUSR2: -#endif -#if RUBY_SIGCHLD - case RUBY_SIGCHLD: #endif func = sighandler; break; @@ -1221,9 +1173,6 @@ trap_handler(VALUE *cmd, int sig) break; case 14: if (memcmp(cptr, "SYSTEM_DEFAULT", 14) == 0) { - if (sig == RUBY_SIGCHLD) { - goto sig_dfl; - } func = SIG_DFL; *cmd = 0; } @@ -1441,6 +1390,7 @@ sig_list(VALUE _) if (reserved_signal_p(signum)) rb_bug(failed); \ perror(failed); \ } while (0) + static int install_sighandler_core(int signum, sighandler_t handler, sighandler_t *old_handler) { @@ -1465,25 +1415,6 @@ install_sighandler_core(int signum, sighandler_t handler, sighandler_t *old_hand # define force_install_sighandler(signum, handler, old_handler) \ INSTALL_SIGHANDLER(install_sighandler_core(signum, handler, old_handler), #signum, signum) -#if RUBY_SIGCHLD -static int -init_sigchld(int sig) -{ - sighandler_t oldfunc; - sighandler_t func = sighandler; - - oldfunc = ruby_signal(sig, SIG_DFL); - if (oldfunc == SIG_ERR) return -1; - ruby_signal(sig, func); - ACCESS_ONCE(VALUE, GET_VM()->trap_list.cmd[sig]) = 0; - - return 0; -} - -# define init_sigchld(signum) \ - INSTALL_SIGHANDLER(init_sigchld(signum), #signum, signum) -#endif - void ruby_sig_finalize(void) { @@ -1495,7 +1426,6 @@ ruby_sig_finalize(void) } } - int ruby_enable_coredump = 0; /* @@ -1592,8 +1522,8 @@ Init_signal(void) install_sighandler(SIGSYS, sig_do_nothing); #endif -#if RUBY_SIGCHLD - init_sigchld(RUBY_SIGCHLD); +#ifdef RUBY_SIGCHLD + install_sighandler(RUBY_SIGCHLD, sighandler); #endif rb_enable_interrupt(); diff --git a/thread.c b/thread.c index 60b5ce1af6..2d255beaec 100644 --- a/thread.c +++ b/thread.c @@ -4511,7 +4511,7 @@ check_signals_nogvl(rb_thread_t *th, int sigwait_fd) else { threadptr_trap_interrupt(vm->ractor.main_thread); } - ret = TRUE; /* for SIGCHLD_LOSSY && rb_sigwait_sleep */ + ret = TRUE; /* for rb_sigwait_sleep */ } return ret; } diff --git a/vm_core.h b/vm_core.h index 7cdd40671d..f0f393e497 100644 --- a/vm_core.h +++ b/vm_core.h @@ -132,18 +132,9 @@ extern int ruby_assert_critical_section_entered; #define RUBY_NSIG NSIG #if defined(SIGCLD) -# define RUBY_SIGCHLD (SIGCLD) +# define RUBY_SIGCHLD (SIGCLD) #elif defined(SIGCHLD) -# define RUBY_SIGCHLD (SIGCHLD) -#else -# define RUBY_SIGCHLD (0) -#endif - -/* platforms with broken or non-existent SIGCHLD work by polling */ -#if defined(__APPLE__) -# define SIGCHLD_LOSSY (1) -#else -# define SIGCHLD_LOSSY (0) +# define RUBY_SIGCHLD (SIGCHLD) #endif #if defined(SIGSEGV) && defined(HAVE_SIGALTSTACK) && defined(SA_SIGINFO) && !defined(__NetBSD__) -- cgit v1.2.1