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 | b6df4527a78346bc5040a3c482a34b9247ec2ee9 (patch) | |
| tree | 824aca1c3c19ce70fa848627920c6c6d489013b6 /thread.c | |
| parent | 72b6d62ce9546a5fb4b04b99bd10578297748171 (diff) | |
| download | ruby-b6df4527a78346bc5040a3c482a34b9247ec2ee9.tar.gz ruby-b6df4527a78346bc5040a3c482a34b9247ec2ee9.tar.xz ruby-b6df4527a78346bc5040a3c482a34b9247ec2ee9.zip | |
* thread.c (rb_mutex_sleep): ensures to re-acquire at waking up.
[ruby-Patches-19361]
git-svn-id: http://svn.ruby-lang.org/repos/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 |
