1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

use SIGCHLD_LOSSY to enable waitpid polling mode

Some systems lack SIGCHLD or have incomplete SIGCHLD
implementations.  So enable polling mode for them.

[ruby-core:87705] [Bug #14867]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63795 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
normal 2018-06-30 00:51:57 +00:00
parent 47f3c4d147
commit ce2a3b40ed
5 changed files with 20 additions and 3 deletions

2
mjit.c
View file

@ -408,7 +408,7 @@ exec_process(const char *path, char *const argv[])
{
int stat, exit_code = -2;
pid_t pid;
rb_vm_t *vm = RUBY_SIGCHLD ? GET_VM() : 0;
rb_vm_t *vm = (RUBY_SIGCHLD || SIGCHLD_LOSSY) ? GET_VM() : 0;
rb_nativethread_cond_t cond;
if (vm) {

View file

@ -1126,7 +1126,7 @@ rb_waitpid(rb_pid_t pid, int *st, int flags)
waitpid_state_init(&w, pid, flags);
w.ec = GET_EC();
if (RUBY_SIGCHLD) {
if (RUBY_SIGCHLD || SIGCHLD_LOSSY) {
waitpid_wait(&w);
}
else {

View file

@ -1066,7 +1066,7 @@ void ruby_waitpid_all(rb_vm_t *); /* process.c */
void
ruby_sigchld_handler(rb_vm_t *vm)
{
if (ATOMIC_EXCHANGE(sigchld_hit, 0)) {
if (SIGCHLD_LOSSY || ATOMIC_EXCHANGE(sigchld_hit, 0)) {
ruby_waitpid_all(vm);
}
}

View file

@ -1375,6 +1375,16 @@ timer_thread_sleep(rb_global_vm_lock_t* gvl)
need_polling = !ubf_threads_empty();
if (SIGCHLD_LOSSY && !need_polling) {
rb_vm_t *vm = container_of(gvl, rb_vm_t, gvl);
rb_native_mutex_lock(&vm->waitpid_lock);
if (!list_empty(&vm->waiting_pids) || !list_empty(&vm->waiting_grps)) {
need_polling = 1;
}
rb_native_mutex_unlock(&vm->waitpid_lock);
}
if (gvl->waiting > 0 || need_polling) {
/* polling (TIME_QUANTUM_USEC usec) */
result = poll(pollfds, 1, TIME_QUANTUM_USEC/1000);

View file

@ -100,6 +100,13 @@
# define RUBY_SIGCHLD (0)
#endif
/* platforms with broken or non-existent SIGCHLD work by polling */
#if defined(__APPLE__) || defined(__WIN32__)
# define SIGCHLD_LOSSY (1)
#else
# define SIGCHLD_LOSSY (0)
#endif
#ifdef HAVE_STDARG_PROTOTYPES
#include <stdarg.h>
#define va_init_list(a,b) va_start((a),(b))