Class: MonitorMixin::ConditionVariable

Inherits:
Object
  • Object
show all
Defined in:
lib/monitor.rb

Overview

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.

Defined Under Namespace

Classes: Timeout

Instance Method Summary collapse

Instance Method Details

#broadcastObject

Wake up all the waiters.



148
149
150
151
152
153
154
155
156
157
# File 'lib/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

#count_waitersObject



159
160
161
# File 'lib/monitor.rb', line 159

def count_waiters
  return @waiters.length
end

#signalObject

Wake up and run the next waiter



138
139
140
141
142
143
144
145
# File 'lib/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

#wait(timeout = nil) ⇒ Object

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.



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/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

#wait_untilObject

call #wait until the supplied block returns true.



131
132
133
134
135
# File 'lib/monitor.rb', line 131

def wait_until
  until yield
	wait
  end
end

#wait_whileObject

call #wait while the supplied block returns true.



124
125
126
127
128
# File 'lib/monitor.rb', line 124

def wait_while
  while yield
	wait
  end
end