summaryrefslogtreecommitdiffstats
path: root/thread.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-04-09 05:43:29 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-04-09 05:43:29 +0000
commita8f9da079c475877e050c37bd5e4e7e31fd437c9 (patch)
tree8dd66363f68e375c821cec96006411e947e35762 /thread.c
parent5ca228946a3c6f4511e40c8fbb0920a20875d175 (diff)
downloadruby-a8f9da079c475877e050c37bd5e4e7e31fd437c9.tar.gz
ruby-a8f9da079c475877e050c37bd5e4e7e31fd437c9.tar.xz
ruby-a8f9da079c475877e050c37bd5e4e7e31fd437c9.zip
* 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: http://svn.ruby-lang.org/repos/ruby/trunk@15931 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'thread.c')
-rw-r--r--thread.c31
1 files changed, 10 insertions, 21 deletions
diff --git a/thread.c b/thread.c
index 4f713a2cc..57b208573 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;
}