summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2023-05-15 23:14:51 +0900
committerGitHub <noreply@github.com>2023-05-15 23:14:51 +0900
commitab7bb38aca0d2b5c2b81142a8e67fbff0f1a4a8a (patch)
tree802485815849e6ac13711f7dd62e91ff951c9426
parentbab9966b7a94a63381d53ad2a8a9a53fcddf6148 (diff)
downloadruby-ab7bb38aca0d2b5c2b81142a8e67fbff0f1a4a8a.tar.gz
Remove explicit SIGCHLD handling. (#7816)
* Remove unused SIGCHLD handling. * Remove unused `init_sigchld`. * Remove unnecessary `#define RUBY_SIGCHLD (0)`. * Remove unused `SIGCHLD_LOSSY`.
-rw-r--r--signal.c82
-rw-r--r--thread.c2
-rw-r--r--vm_core.h13
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
@@ -1153,9 +1108,6 @@ default_handler(int sig)
#ifdef SIGUSR2
case SIGUSR2:
#endif
-#if RUBY_SIGCHLD
- case RUBY_SIGCHLD:
-#endif
func = sighandler;
break;
#ifdef SIGBUS
@@ -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__)