From 25b15f94415ed147526ef0f712ceb915e43ac0fe Mon Sep 17 00:00:00 2001 From: normal Date: Fri, 29 Jun 2018 07:52:24 +0000 Subject: [PATCH] process.c (waitpid_nogvl): check interrupts before sleeping We may be interrupted by another thread after setting ubf, but before we re-acquire interrupt_lock again to sleep on w->cond. This should fix test_wait_interrupt in test/ruby/test_process.rb git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63789 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- process.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/process.c b/process.c index b3932e88ce..4388a6ba0f 100644 --- a/process.c +++ b/process.c @@ -1017,7 +1017,11 @@ waitpid_nogvl(void *x) rb_thread_t *th = rb_ec_thread_ptr(w->ec); rb_native_mutex_lock(&th->interrupt_lock); - if (!w->ret) { /* we must check this before waiting */ + /* + * We must check again before waiting, timer-thread may change w->ret + * by the time we enter this. And we may also be interrupted. + */ + if (!w->ret && !RUBY_VM_INTERRUPTED_ANY(w->ec)) { rb_native_cond_wait(w->cond, &th->interrupt_lock); } rb_native_mutex_unlock(&th->interrupt_lock);