Module: MonitorMixin
- Included in:
- Monitor
- Defined in:
- lib/monitor.rb
Overview
Adds monitor functionality to an arbitrary object by mixing the module with include. For example:
require 'monitor.rb'
buf = []
buf.extend(MonitorMixin)
empty_cond = buf.new_cond
# consumer
Thread.start do
loop do
buf.synchronize do
empty_cond.wait_while { buf.empty? }
print buf.shift
end
end
end
# producer
while line = ARGF.gets
buf.synchronize do
buf.push(line)
empty_cond.signal
end
end
The consumer thread waits for the producer thread to push a line to buf while buf.empty?, and the producer thread (main thread) reads a line from ARGF and push it to buf, then call empty_cond.signal.
Defined Under Namespace
Classes: ConditionVariable
Class Method Summary collapse
Instance Method Summary collapse
-
#mon_enter ⇒ Object
Enters exclusive section.
-
#mon_exit ⇒ Object
Leaves exclusive section.
-
#mon_synchronize ⇒ Object
(also: #synchronize)
Enters exclusive section and executes the block.
-
#mon_try_enter ⇒ Object
(also: #try_mon_enter)
Attempts to enter exclusive section.
-
#new_cond ⇒ Object
FIXME: This isn’t documented in Nutshell.
Class Method Details
.extend_object(obj) ⇒ Object
185 186 187 188 |
# File 'lib/monitor.rb', line 185 def self.extend_object(obj) super(obj) obj.instance_eval {mon_initialize()} end |
Instance Method Details
#mon_enter ⇒ Object
Enters exclusive section.
212 213 214 215 216 217 218 |
# File 'lib/monitor.rb', line 212 def mon_enter Thread.critical = true mon_acquire(@mon_entering_queue) @mon_count += 1 ensure Thread.critical = false end |
#mon_exit ⇒ Object
Leaves exclusive section.
223 224 225 226 227 228 229 230 231 232 |
# File 'lib/monitor.rb', line 223 def mon_exit mon_check_owner Thread.critical = true @mon_count -= 1 if @mon_count == 0 mon_release end Thread.critical = false Thread.pass end |
#mon_synchronize ⇒ Object Also known as: synchronize
Enters exclusive section and executes the block. Leaves the exclusive section automatically when the block exits. See example under MonitorMixin.
239 240 241 242 243 244 245 246 |
# File 'lib/monitor.rb', line 239 def mon_synchronize mon_enter begin yield ensure mon_exit end end |
#mon_try_enter ⇒ Object Also known as: try_mon_enter
Attempts to enter exclusive section. Returns false if lock fails.
193 194 195 196 197 198 199 200 201 202 203 204 205 |
# File 'lib/monitor.rb', line 193 def mon_try_enter result = false Thread.critical = true if @mon_owner.nil? @mon_owner = Thread.current end if @mon_owner == Thread.current @mon_count += 1 result = true end Thread.critical = false return result end |
#new_cond ⇒ Object
FIXME: This isn’t documented in Nutshell.
Create a new condition variable for this monitor. This facilitates control of the monitor with #signal and #wait.
255 256 257 |
# File 'lib/monitor.rb', line 255 def new_cond return ConditionVariable.new(self) end |