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/