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

ruby-changes:21990

From: nobu <ko1@a...>
Date: Wed, 14 Dec 2011 12:20:16 +0900 (JST)
Subject: [ruby-changes:21990] nobu:r34039 (trunk): * load.c (load_unlock): release loading barrier and then remove it

nobu	2011-12-14 12:20:02 +0900 (Wed, 14 Dec 2011)

  New Revision: 34039

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=34039

  Log:
    * load.c (load_unlock): release loading barrier and then remove it
      from loading_table if it is not in-use.  [Bug #5754]
    * thread.c (rb_barrier_release, rb_barrier_destroy): return
      whether any other threads are waiting on it.

  Modified files:
    trunk/ChangeLog
    trunk/load.c
    trunk/thread.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 34038)
+++ ChangeLog	(revision 34039)
@@ -1,3 +1,11 @@
+Wed Dec 14 12:19:59 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* load.c (load_unlock): release loading barrier and then remove it
+	  from loading_table if it is not in-use.  [Bug #5754]
+
+	* thread.c (rb_barrier_release, rb_barrier_destroy): return
+	  whether any other threads are waiting on it.
+
 Wed Dec 14 11:23:45 2011  NARUSE, Yui  <naruse@r...>
 
 	* thread_pthread.c (ubf_select): call rb_thread_wakeup_timer_thread()
Index: load.c
===================================================================
--- load.c	(revision 34038)
+++ load.c	(revision 34039)
@@ -427,12 +427,10 @@
 
 	if (!st_lookup(loading_tbl, key, &data)) return;
 	barrier = (VALUE)data;
-	if (rb_barrier_waiting(barrier) ||
-	    (st_delete(loading_tbl, &key, &data) && (xfree((char *)key), 1))) {
-	    if (done)
-		rb_barrier_destroy(barrier);
-	    else
-		rb_barrier_release(barrier);
+	if (!(done ? rb_barrier_destroy(barrier) : rb_barrier_release(barrier))) {
+	    if (st_delete(loading_tbl, &key, &data)) {
+		xfree((char *)key);
+	    }
 	}
     }
 }
Index: thread.c
===================================================================
--- thread.c	(revision 34038)
+++ thread.c	(revision 34039)
@@ -3719,18 +3719,31 @@
     return waiting ? Qnil : Qfalse;
 }
 
+/*
+ * Release a barrrier, and return true if it has waiting threads.
+ */
 VALUE
 rb_barrier_release(VALUE self)
 {
-    return rb_mutex_unlock(GetBarrierPtr(self));
+    VALUE mutex = GetBarrierPtr(self);
+    rb_mutex_t *m;
+    rb_mutex_unlock(mutex);
+    GetMutexPtr(mutex, m);
+    return m->cond_waiting > 0 ? Qtrue : Qfalse;
 }
 
+/*
+ * Release and destroy a barrrier, and return true if it has waiting threads.
+ */
 VALUE
 rb_barrier_destroy(VALUE self)
 {
     VALUE mutex = GetBarrierPtr(self);
+    rb_mutex_t *m;
     DATA_PTR(self) = 0;
-    return rb_mutex_unlock(mutex);
+    rb_mutex_unlock(mutex);
+    GetMutexPtr(mutex, m);
+    return m->cond_waiting > 0 ? Qtrue : Qfalse;
 }
 
 int

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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