free_mutant/lib/mutant/actor/receiver.rb
Markus Schirp 95a20bdeae Fix actor receiver to use private attr getters instead of ivars
* Ivars lead to typos being caught late. Typos on send get caught early.
2014-12-02 03:11:39 +00:00

48 lines
927 B
Ruby

module Mutant
module Actor
# Receiver side of an actor
class Receiver
include Concord.new(:mutex, :mailbox)
# Receives a message, blocking
#
# @return [Object]
#
# @api private
#
def call
2.times do
message = try_blocking_receive
return message unless message.equal?(Undefined)
end
fail ProtocolError
end
private
# Try a blocking receive
#
# @return [Undefined]
# if there is no message yet
#
# @return [Object]
# if there is a message
#
# @api private
#
def try_blocking_receive
mutex.lock
if mailbox.empty?
mutex.unlock
Thread.stop
Undefined
else
mailbox.shift.tap do
mutex.unlock
end
end
end
end # Receiver
end # Actor
end # Mutant