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.
Enters exclusive section.
 
               # File monitor.rb, line 212
def mon_enter
  Thread.critical = true
  mon_acquire(@mon_entering_queue)
  @mon_count += 1
ensure
  Thread.critical = false
end
             
            Leaves exclusive section.
 
               # File 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
             
            Enters exclusive section and executes the block.  Leaves the exclusive
section automatically when the block exits.  See example under
MonitorMixin.
 
               # File monitor.rb, line 239
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 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