Extended maintenance of Ruby versions 1.8.7 and 1.9.2 ended on July 31, 2014. Read more

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

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus