summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--thread.c31
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 <nobu@ruby-lang.org>
+
+ * 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 <nobu@ruby-lang.org>
* test/ruby/test_thread.rb: new tests from Sylvain Joyeux in
[ruby-Patches-19361].
-Tue Apr 8 21:38:55 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * 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 <nobu@ruby-lang.org>
* 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;
}