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

ruby-changes:11418

From: shyouhei <ko1@a...>
Date: Mon, 23 Mar 2009 18:26:15 +0900 (JST)
Subject: [ruby-changes:11418] Ruby:r23042 (ruby_1_8_6): merge revision(s) 17874,17886:

shyouhei	2009-03-23 18:26:03 +0900 (Mon, 23 Mar 2009)

  New Revision: 23042

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

  Log:
    merge revision(s) 17874,17886:
    * eval.c (rb_thread_join): new API.
    * ext/thread/thread.c (wait_mutex, lock_mutex): wait until the locking
      thread exits.  [ruby-dev:34856]
    * eval.c (rb_thread_value): missed to change at r17874.  [ruby-core:17595]

  Modified files:
    branches/ruby_1_8_6/ChangeLog
    branches/ruby_1_8_6/eval.c
    branches/ruby_1_8_6/ext/thread/thread.c
    branches/ruby_1_8_6/version.h

Index: ruby_1_8_6/ext/thread/thread.c
===================================================================
--- ruby_1_8_6/ext/thread/thread.c	(revision 23041)
+++ ruby_1_8_6/ext/thread/thread.c	(revision 23042)
@@ -247,19 +247,22 @@
     return Qnil;
 }
 
+extern int rb_thread_join _((VALUE thread, double limit));
+#define DELAY_INFTY 1E30
+
 static VALUE
-wait_list_inner(List *list)
+wait_list_inner(VALUE arg)
 {
-    push_list(list, rb_thread_current());
+    push_list((List *)arg, rb_thread_current());
     rb_thread_stop();
     return Qnil;
 }
 
 static VALUE
-wait_list_cleanup(List *list)
+wait_list_cleanup(VALUE arg)
 {
     /* cleanup in case of spurious wakeups */
-    remove_one(list, rb_thread_current());
+    remove_one((List *)arg, rb_thread_current());
     return Qnil;
 }
 
@@ -395,6 +398,25 @@
     return Qtrue;
 }
 
+static VALUE
+wait_mutex(VALUE arg)
+{
+    Mutex *mutex = (Mutex *)arg;
+    VALUE current = rb_thread_current();
+
+    push_list(&mutex->waiting, current);
+    do {
+	rb_thread_critical = 0;
+	rb_thread_join(mutex->owner, DELAY_INFTY);
+	rb_thread_critical = 1;
+	if (!MUTEX_LOCKED_P(mutex)) {
+	    mutex->owner = current;
+	    break;
+	}
+    } while (mutex->owner != current);
+    return Qnil;
+}
+
 /*
  * Document-method: lock
  * call-seq: lock
@@ -415,14 +437,7 @@
 	mutex->owner = current;
     }
     else {
-	do {
-	    wait_list(&mutex->waiting);
-	    rb_thread_critical = 1;
-	    if (!MUTEX_LOCKED_P(mutex)) {
-		mutex->owner = current;
-		break;
-	    }
-	} while (mutex->owner != current);
+	rb_ensure(wait_mutex, (VALUE)mutex, wait_list_cleanup, (VALUE)&mutex->waiting);
     }
 
     rb_thread_critical = 0;
Index: ruby_1_8_6/ChangeLog
===================================================================
--- ruby_1_8_6/ChangeLog	(revision 23041)
+++ ruby_1_8_6/ChangeLog	(revision 23042)
@@ -1,3 +1,14 @@
+Mon Mar 23 18:12:47 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* eval.c (rb_thread_value): missed to change at r17874.  [ruby-core:17595]
+
+Mon Mar 23 18:12:47 2009  Nobuyoshi Nakada  <nobu@r...>
+
+	* eval.c (rb_thread_join): new API.
+
+	* ext/thread/thread.c (wait_mutex, lock_mutex): wait until the locking
+	  thread exits.  [ruby-dev:34856]
+
 Mon Mar 23 17:39:29 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* file.c (file_load_ok): checks if regular file, except for the
Index: ruby_1_8_6/version.h
===================================================================
--- ruby_1_8_6/version.h	(revision 23041)
+++ ruby_1_8_6/version.h	(revision 23042)
@@ -2,7 +2,7 @@
 #define RUBY_RELEASE_DATE "2009-03-23"
 #define RUBY_VERSION_CODE 186
 #define RUBY_RELEASE_CODE 20090323
-#define RUBY_PATCHLEVEL 363
+#define RUBY_PATCHLEVEL 364
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
Index: ruby_1_8_6/eval.c
===================================================================
--- ruby_1_8_6/eval.c	(revision 23041)
+++ ruby_1_8_6/eval.c	(revision 23042)
@@ -1441,8 +1441,6 @@
 
 int ruby_in_eval;
 
-static int rb_thread_join _((rb_thread_t, double));
-
 static void rb_thread_cleanup _((void));
 static void rb_thread_wait_other_threads _((void));
 
@@ -11130,8 +11128,11 @@
     return curr_thread->select_value;
 }
 
+static int rb_thread_join0 _((rb_thread_t, double));
+int rb_thread_join _((VALUE, double));
+
 static int
-rb_thread_join(th, limit)
+rb_thread_join0(th, limit)
     rb_thread_t th;
     double limit;
 {
@@ -11173,7 +11174,16 @@
     return Qtrue;
 }
 
+int
+rb_thread_join(thread, limit)
+    VALUE thread;
+    double limit;
+{
+    if (limit < 0) limit = DELAY_INFTY;
+    return rb_thread_join0(rb_thread_check(thread), limit);
+}
 
+
 /*
  *  call-seq:
  *     thr.join          => thr
@@ -11222,11 +11232,10 @@
 {
     VALUE limit;
     double delay = DELAY_INFTY;
-    rb_thread_t th = rb_thread_check(thread);
 
     rb_scan_args(argc, argv, "01", &limit);
     if (!NIL_P(limit)) delay = rb_num2dbl(limit);
-    if (!rb_thread_join(th, delay))
+    if (!rb_thread_join0(rb_thread_check(thread), delay))
 	return Qnil;
     return thread;
 }
@@ -12269,7 +12278,7 @@
 {
     rb_thread_t th = rb_thread_check(thread);
 
-    while (!rb_thread_join(th, DELAY_INFTY));
+    while (!rb_thread_join0(th, DELAY_INFTY));
 
     return th->result;
 }

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

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