In Files

  • monitor.rb

MonitorMixin

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.

Public Class Methods

extend_object(obj) click to toggle source
 
               # File monitor.rb, line 185
def self.extend_object(obj)
  super(obj)
  obj.instance_eval {mon_initialize()}
end
            
new(*args) click to toggle source
 
               # File monitor.rb, line 261
def initialize(*args)
  super
  mon_initialize
end
            

Public Instance Methods

mon_enter() click to toggle source

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
            
mon_exit() click to toggle source

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
            
mon_synchronize() click to toggle source

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
            
Also aliased as: synchronize
mon_try_enter() click to toggle source

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
            
Also aliased as: try_mon_enter
new_cond() click to toggle source

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.

 
               # File monitor.rb, line 255
def new_cond
  return ConditionVariable.new(self)
end
            
synchronize() click to toggle source
Alias for: mon_synchronize
try_mon_enter() click to toggle source

For backward compatibility

Alias for: mon_try_enter