Adds monitor functionality to an arbitrary object by mixing the module with include. For example:
require 'monitor' 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.
Enters exclusive section.
# File monitor.rb, line 173
def mon_enter
if @mon_owner != Thread.current
@mon_mutex.lock
@mon_owner = Thread.current
end
@mon_count += 1
end
Leaves exclusive section.
# File monitor.rb, line 184
def mon_exit
mon_check_owner
@mon_count -=1
if @mon_count == 0
@mon_owner = nil
@mon_mutex.unlock
end
end
Enters exclusive section and executes the block. Leaves the exclusive section automatically when the block exits. See example under MonitorMixin.
# File monitor.rb, line 198
def mon_synchronize
mon_enter
begin
yield
ensure
mon_exit
end
end
Attempts to enter exclusive section. Returns false if lock fails.
# File monitor.rb, line 157
def mon_try_enter
if @mon_owner != Thread.current
unless @mon_mutex.try_lock
return false
end
@mon_owner = Thread.current
end
@mon_count += 1
return true
end
Creates a new MonitorMixin::ConditionVariable associated with the receiver.
# File monitor.rb, line 212
def new_cond
return ConditionVariable.new(self)
end