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

ruby-changes:21987

From: nobu <ko1@a...>
Date: Wed, 14 Dec 2011 10:20:22 +0900 (JST)
Subject: [ruby-changes:21987] nobu:r34036 (trunk): * load.c (load_lock): delete the loading barrier if it has been

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

  New Revision: 34036

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

  Log:
    * load.c (load_lock): delete the loading barrier if it has been
      destroyed.
    * thread.c (rb_barrier_wait): return nil for recursive lock
      instead of false, to distinguish it from destroyed barrier.

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

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 34035)
+++ ChangeLog	(revision 34036)
@@ -1,3 +1,11 @@
+Wed Dec 14 10:20:08 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* load.c (load_lock): delete the loading barrier if it has been
+	  destroyed.
+
+	* thread.c (rb_barrier_wait): return nil for recursive lock
+	  instead of false, to distinguish it from destroyed barrier.
+
 Wed Dec 14 01:24:55 2011  okkez  <okkez000@g...>
 
 	* thread_pthread.c (rb_thread_create_timer_thread): fix memory
Index: load.c
===================================================================
--- load.c	(revision 34035)
+++ load.c	(revision 34036)
@@ -405,7 +405,15 @@
 	rb_warning("loading in progress, circular require considered harmful - %s", ftptr);
 	rb_backtrace();
     }
-    return RTEST(rb_barrier_wait((VALUE)data)) ? (char *)ftptr : 0;
+    switch (rb_barrier_wait((VALUE)data)) {
+      case Qfalse:
+	data = (st_data_t)ftptr;
+	st_delete(loading_tbl, &data, 0);
+	return 0;
+      case Qnil:
+	return 0;
+    }
+    return (char *)ftptr;
 }
 
 static void
Index: thread.c
===================================================================
--- thread.c	(revision 34035)
+++ thread.c	(revision 34036)
@@ -3694,19 +3694,29 @@
     return barrier;
 }
 
+/*
+ * Wait a barrier.
+ *
+ * Returns
+ *  true:  acquired the barrier
+ *  false: the barrier was destroyed and no other threads waiting
+ *  nil:   the barrier was destroyed but still in use
+ */
 VALUE
 rb_barrier_wait(VALUE self)
 {
     VALUE mutex = GetBarrierPtr(self);
     rb_mutex_t *m;
+    int waiting;
 
     if (!mutex) return Qfalse;
     GetMutexPtr(mutex, m);
-    if (m->th == GET_THREAD()) return Qfalse;
+    if (m->th == GET_THREAD()) return Qnil;
     rb_mutex_lock(mutex);
     if (DATA_PTR(self)) return Qtrue;
+    waiting = m->cond_waiting;
     rb_mutex_unlock(mutex);
-    return Qfalse;
+    return waiting ? Qnil : Qfalse;
 }
 
 VALUE

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

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