Extended maintenance of Ruby versions 1.8.7 and 1.9.2 will end 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'

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 149
def self.extend_object(obj)
  super(obj)
  obj.__send__(:mon_initialize)
end
            
new(*args) click to toggle source
 
               # File monitor.rb, line 218
def initialize(*args)
  super
  mon_initialize
end
            

Public Instance Methods

mon_enter() click to toggle source

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

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

Creates a new MonitorMixin::ConditionVariable associated with the receiver.

 
               # File monitor.rb, line 212
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