class Celluloid::EventedMailbox

An alternative implementation of Celluloid::Mailbox using Reactor

Attributes

reactor[R]

Public Class Methods

new(reactor_class) click to toggle source
Calls superclass method Celluloid::Mailbox.new
# File lib/celluloid/evented_mailbox.rb, line 6
def initialize(reactor_class)
  super()
  # @condition won't be used in the class.
  @reactor = reactor_class.new
end

Public Instance Methods

<<(message) click to toggle source

Add a message to the Mailbox

# File lib/celluloid/evented_mailbox.rb, line 13
def <<(message)
  @mutex.lock
  begin
    if mailbox_full || @dead
      dead_letter(message)
      return
    end
    if message.is_a?(SystemEvent)
      # SystemEvents are high priority messages so they get added to the
      # head of our message queue instead of the end
      @messages.unshift message
    else
      @messages << message
    end

    current_actor = Thread.current[:celluloid_actor]
    @reactor.wakeup unless current_actor && current_actor.mailbox == self
  rescue IOError
    Logger.crash "reactor crashed", $!
    dead_letter(message)
  ensure
    @mutex.unlock rescue nil
  end
  nil
end
next_message(block) click to toggle source

Obtain the next message from the mailbox that matches the given block

Calls superclass method Celluloid::Mailbox#next_message
# File lib/celluloid/evented_mailbox.rb, line 63
def next_message(block)
  @mutex.lock
  begin
    super(&block)
  ensure
    @mutex.unlock rescue nil
  end
end
receive(timeout = nil, &block) click to toggle source

Receive a message from the Mailbox

# File lib/celluloid/evented_mailbox.rb, line 40
def receive(timeout = nil, &block)
  message = next_message(block)

  until message
    if timeout
      now = Time.now
      wait_until ||= now + timeout
      wait_interval = wait_until - now
      return if wait_interval < 0
    else
      wait_interval = nil
    end

    @reactor.run_once(wait_interval)
    message = next_message(block)
  end

  message
rescue IOError
  raise MailboxShutdown, "mailbox shutdown called during receive"
end
shutdown() click to toggle source

Cleanup any IO objects this Mailbox may be using

Calls superclass method Celluloid::Mailbox#shutdown
# File lib/celluloid/evented_mailbox.rb, line 73
def shutdown
  super do
    @reactor.shutdown
  end
end