Object
FIXME: This isn't documented in Nutshell.
Since MonitorMixin#new_cond returns a ConditionVariable, and the example above calls while_wait and signal, this class should be documented.
Wake up all the waiters.
# File monitor.rb, line 148 def broadcast @monitor.instance_eval {mon_check_owner()} Thread.critical = true for t in @waiters t.wakeup end @waiters.clear Thread.critical = false Thread.pass end
# File monitor.rb, line 159 def count_waiters return @waiters.length end
Wake up and run the next waiter
# File monitor.rb, line 138 def signal @monitor.instance_eval {mon_check_owner()} Thread.critical = true t = @waiters.shift t.wakeup if t Thread.critical = false Thread.pass end
Create a new timer with the argument timeout, and add the current thread to the list of waiters. Then the thread is stopped. It will be resumed when a corresponding signal occurs.
# File monitor.rb, line 93 def wait(timeout = nil) @monitor.instance_eval {mon_check_owner()} timer = create_timer(timeout) Thread.critical = true count = @monitor.instance_eval {mon_exit_for_cond()} @waiters.push(Thread.current) begin Thread.stop return true rescue Timeout return false ensure Thread.critical = true begin if timer && timer.alive? Thread.kill(timer) end if @waiters.include?(Thread.current) # interrupted? @waiters.delete(Thread.current) end @monitor.instance_eval {mon_enter_for_cond(count)} ensure Thread.critical = false end end end
call wait until the
supplied block returns true
.
# File monitor.rb, line 131 def wait_until until yield wait end end
call wait while the
supplied block returns true
.
# File monitor.rb, line 124 def wait_while while yield wait end end