From d7b8efd872571bdf815540c902da254c3e6ea3a4 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 8 Apr 2008 12:36:42 +0000 Subject: * thread.c (rb_mutex_sleep): ensures to re-acquire at waking up. [ruby-Patches-19361] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15928 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- thread.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'thread.c') diff --git a/thread.c b/thread.c index bdf1d4acc8..4f713a2cc9 100644 --- a/thread.c +++ b/thread.c @@ -2423,6 +2423,21 @@ rb_mutex_unlock(VALUE self) return self; } +static VALUE +rb_mutex_sleep_forever(VALUE time) +{ + rb_thread_sleep_forever(); + return Qnil; +} + +static VALUE +rb_mutex_wait_for(VALUE time) +{ + const struct timeval *t = (struct timeval *)time; + rb_thread_wait_for(*t); + return Qnil; +} + VALUE rb_mutex_sleep(VALUE self, VALUE timeout) { @@ -2435,19 +2450,18 @@ rb_mutex_sleep(VALUE self, VALUE timeout) rb_mutex_unlock(self); beg = time(0); if (NIL_P(timeout)) { - rb_thread_sleep_forever(); + rb_ensure(rb_mutex_sleep_forever, Qnil, rb_mutex_lock, self); } else { - rb_thread_wait_for(t); + rb_ensure(rb_mutex_wait_for, (VALUE)&t, rb_mutex_lock, self); } - rb_mutex_lock(self); end = time(0) - beg; return INT2FIX(end); } /* * call-seq: - * mutex.sleep(timeout = nil) => self + * mutex.sleep(timeout = nil) => number * * Releases the lock and sleeps +timeout+ seconds if it is given and * non-nil or forever. Raises +ThreadError+ if +mutex+ wasn't locked by -- cgit v1.2.3