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 || @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 @condition.signal nil ensure @mutex.unlock rescue nil end end
Is the mailbox alive?
# File lib/celluloid/mailbox.rb, line 105 def alive? !@dead end
Receive a message from the Mailbox. May return nil and may return before the specified timeout.
# File lib/celluloid/mailbox.rb, line 50 def check(timeout = nil, &block) message = nil @mutex.lock begin raise MailboxDead, "attempted to receive from a dead mailbox" if @dead Timers::Wait.for(timeout) do |remaining| message = next_message(&block) break message if message @condition.wait(@mutex, remaining) end ensure @mutex.unlock rescue nil end return message end
Iterate through the mailbox
# File lib/celluloid/mailbox.rb, line 115 def each(&block) to_a.each(&block) end
Inspect the contents of the Mailbox
# File lib/celluloid/mailbox.rb, line 120 def inspect "#<#{self.class}:#{object_id.to_s(16)} @messages=[#{map { |m| m.inspect }.join(', ')}]>" end
Receive a letter from the mailbox. Guaranteed to return a message. If timeout is exceeded, raise a TimeoutError.
# File lib/celluloid/mailbox.rb, line 73 def receive(timeout = nil, &block) Timers::Wait.for(timeout) do |remaining| if message = check(timeout, &block) return message end end raise TimeoutError.new("receive timeout exceeded") end
Shut down this mailbox and clean up its contents
# File lib/celluloid/mailbox.rb, line 84 def shutdown raise MailboxDead, "mailbox already shutdown" if @dead @mutex.lock begin yield if block_given? messages = @messages @messages = [] @dead = true ensure @mutex.unlock rescue nil end messages.each do |msg| dead_letter msg msg.cleanup if msg.respond_to? :cleanup end true end
Number of messages in the Mailbox
# File lib/celluloid/mailbox.rb, line 125 def size @mutex.synchronize { @messages.size } end
Generated with the Darkfish Rdoc Generator 2.