[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]