| Class | MonitorMixin::ConditionVariable |
| In: |
monitor.rb
|
| Parent: | 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.
Methods
Public Class methods
# File monitor.rb, line 153
153: def initialize(monitor)
154: @monitor = monitor
155: @waiters = []
156: end
Public Instance methods
# File monitor.rb, line 136
136: def broadcast
137: @monitor.instance_eval {mon_check_owner()}
138: Thread.critical = true
139: for t in @waiters
140: t.wakeup
141: end
142: @waiters.clear
143: Thread.critical = false
144: Thread.pass
145: end
# File monitor.rb, line 127
127: def signal
128: @monitor.instance_eval {mon_check_owner()}
129: Thread.critical = true
130: t = @waiters.shift
131: t.wakeup if t
132: Thread.critical = false
133: Thread.pass
134: end
# File monitor.rb, line 89
89: def wait(timeout = nil)
90: @monitor.instance_eval {mon_check_owner()}
91: timer = create_timer(timeout)
92:
93: Thread.critical = true
94: count = @monitor.instance_eval {mon_exit_for_cond()}
95: @waiters.push(Thread.current)
96:
97: begin
98: Thread.stop
99: return true
100: rescue Timeout
101: return false
102: ensure
103: Thread.critical = true
104: if timer && timer.alive?
105: Thread.kill(timer)
106: end
107: if @waiters.include?(Thread.current) # interrupted?
108: @waiters.delete(Thread.current)
109: end
110: @monitor.instance_eval {mon_enter_for_cond(count)}
111: Thread.critical = false
112: end
113: end