ruby-changes:51903
From: normal <ko1@a...>
Date: Mon, 30 Jul 2018 15:35:14 +0900 (JST)
Subject: [ruby-changes:51903] normal:r64117 (trunk): process.c (waitpid_nogvl): prevent conflicting use of sleep_cond
normal 2018-07-30 15:35:08 +0900 (Mon, 30 Jul 2018) New Revision: 64117 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=64117 Log: process.c (waitpid_nogvl): prevent conflicting use of sleep_cond We reuse sleep_cond for waitpid notifications as well as GVL waiting. So we must take care to not hold onto sleep_cond when we try to reacquire GVL. [ruby-core:88183] Modified files: trunk/process.c Index: process.c =================================================================== --- process.c (revision 64116) +++ process.c (revision 64117) @@ -1144,6 +1144,9 @@ waitpid_nogvl(void *x) https://github.com/ruby/ruby/blob/trunk/process.c#L1144 rb_sigwait_fd_put(th, sigwait_fd); } else { + if (!w->cond) + w->cond = rb_sleep_cond_get(w->ec); + /* another thread calling rb_sigwait_sleep will process * signals for us */ if (SIGCHLD_LOSSY) { @@ -1152,6 +1155,16 @@ waitpid_nogvl(void *x) https://github.com/ruby/ruby/blob/trunk/process.c#L1155 rb_native_cond_wait(w->cond, &th->interrupt_lock); } } + + /* + * we must release th->native_thread_data.sleep_cond when + * re-acquiring GVL: + */ + if (w->cond) { + rb_sleep_cond_put(w->cond); + w->cond = 0; + } + rb_native_mutex_unlock(&th->interrupt_lock); if (sigwait_fd >= 0) @@ -1183,7 +1196,10 @@ waitpid_cleanup(VALUE x) https://github.com/ruby/ruby/blob/trunk/process.c#L1196 list_del(&w->wnode); rb_native_mutex_unlock(&vm->waitpid_lock); } - rb_sleep_cond_put(w->cond); + + /* we may have never released and re-acquired GVL */ + if (w->cond) + rb_sleep_cond_put(w->cond); return Qfalse; } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/