diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-04-08 12:36:42 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-04-08 12:36:42 +0000 |
commit | d7b8efd872571bdf815540c902da254c3e6ea3a4 (patch) | |
tree | 824aca1c3c19ce70fa848627920c6c6d489013b6 /thread.c | |
parent | 298d20c25bb2cbd9b9b26180d971f6c4463c3b85 (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.c | 22 |
1 files changed, 18 insertions, 4 deletions
@@ -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 |