From 69352c0d4d98a16f82ae388297ecfff940747ae2 Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 9 Apr 2008 05:43:29 +0000 Subject: * thread.c (lock_func): optimized and checks for interrupt_flag. based on a patch from Sylvain Joyeux in [ruby-Patches-19361] and [ruby-Patches-19362]. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15931 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 11 +++++++---- thread.c | 31 ++++++++++--------------------- 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/ChangeLog b/ChangeLog index 561b3b6f45..7049eaa311 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,12 +1,15 @@ +Wed Apr 9 14:43:26 2008 Nobuyoshi Nakada + + * thread.c (lock_func): optimized and checks for interrupt_flag. + based on a patch from Sylvain Joyeux in [ruby-Patches-19361] and + [ruby-Patches-19362]. + Wed Apr 9 12:12:01 2008 Nobuyoshi Nakada * test/ruby/test_thread.rb: new tests from Sylvain Joyeux in [ruby-Patches-19361]. -Tue Apr 8 21:38:55 2008 Nobuyoshi Nakada - - * thread.c (lock_func): optimized. based on a patch from Sylvain - Joyeux in [ruby-Patches-19362]. +Tue Apr 8 21:36:40 2008 Nobuyoshi Nakada * thread.c (rb_mutex_sleep): ensures to re-acquire at waking up. [ruby-Patches-19361] diff --git a/thread.c b/thread.c index 4f713a2cc9..57b2085735 100644 --- a/thread.c +++ b/thread.c @@ -2320,30 +2320,19 @@ rb_mutex_trylock(VALUE self) static VALUE lock_func(rb_thread_t *th, mutex_t *mutex) { - int locked = 0; - - while (locked == 0) { - native_mutex_lock(&mutex->lock); - { - if (mutex->th == 0) { - mutex->th = th; - locked = 1; - } - else { - mutex->cond_waiting++; - native_cond_wait(&mutex->cond, &mutex->lock); + native_mutex_lock(&mutex->lock); + while (mutex->th) { + mutex->cond_waiting++; + native_cond_wait(&mutex->cond, &mutex->lock); - if (th->interrupt_flag) { - locked = 1; - } - else if (mutex->th == 0) { - mutex->th = th; - locked = 1; - } - } + if (th->interrupt_flag) { + native_mutex_unlock(&mutex->lock); + RUBY_VM_CHECK_INTS(); + native_mutex_lock(&mutex->lock); } - native_mutex_unlock(&mutex->lock); } + mutex->th = th; + native_mutex_unlock(&mutex->lock); return Qnil; } -- cgit v1.2.3