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:
parent
47f3c4d147
commit
ce2a3b40ed
5 changed files with 20 additions and 3 deletions
2
mjit.c
2
mjit.c
|
@ -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) {
|
||||
|
|
|
@ -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 {
|
||||
|
|
2
signal.c
2
signal.c
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue