summaryrefslogtreecommitdiff
path: root/thread.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-04-08 12:36:42 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-04-08 12:36:42 +0000
commitd7b8efd872571bdf815540c902da254c3e6ea3a4 (patch)
tree824aca1c3c19ce70fa848627920c6c6d489013b6 /thread.c
parent298d20c25bb2cbd9b9b26180d971f6c4463c3b85 (diff)
* 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
Diffstat (limited to 'thread.c')
-rw-r--r--thread.c22
1 files changed, 18 insertions, 4 deletions
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