Object
Actors communicate with asynchronous messages. Messages are buffered in Mailboxes until Actors can act upon them.
Add a message to the Mailbox
# File lib/celluloid/mailbox.rb, line 26 def <<(message) @mutex.lock begin if mailbox_full Logger.debug "Discarded message: #{message}" return end if message.is_a?(SystemEvent) # Silently swallow system events sent to dead actors return if @dead # SystemEvents are high priority messages so they get added to the # head of our message queue instead of the end @messages.unshift message else raise MailboxError, "dead recipient" if @dead @messages << message end @condition.signal nil ensure @mutex.unlock rescue nil end end
Is the mailbox alive?
# File lib/celluloid/mailbox.rb, line 116 def alive? !@dead end
Iterate through the mailbox
# File lib/celluloid/mailbox.rb, line 126 def each(&block) to_a.each(&block) end
Inspect the contents of the Mailbox
# File lib/celluloid/mailbox.rb, line 131 def inspect "#<#{self.class}:#{object_id.to_s(16)} @messages=[#{map { |m| m.inspect }.join(', ')}]>" end
Retrieve the next message in the mailbox
# File lib/celluloid/mailbox.rb, line 84 def next_message message = nil if block_given? index = @messages.index do |msg| yield(msg) || msg.is_a?(SystemEvent) end message = @messages.slice!(index, 1).first if index else message = @messages.shift end message end
Receive a message from the Mailbox
# File lib/celluloid/mailbox.rb, line 53 def receive(timeout = nil, &block) message = nil @mutex.lock begin raise MailboxError, "attempted to receive from a dead mailbox" if @dead begin message = next_message(&block) unless 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 @condition.wait(@mutex, wait_interval) end end until message message ensure @mutex.unlock rescue nil end end
Shut down this mailbox and clean up its contents
# File lib/celluloid/mailbox.rb, line 101 def shutdown @mutex.lock begin messages = @messages @messages = [] @dead = true ensure @mutex.unlock rescue nil end messages.each { |msg| msg.cleanup if msg.respond_to? :cleanup } true end
Number of messages in the Mailbox
# File lib/celluloid/mailbox.rb, line 136 def size @mutex.synchronize { @messages.size } end
Generated with the Darkfish Rdoc Generator 2.