Skip to content

Commit

Permalink
use actor name rather than remote actor mailbox to reference it
Browse files Browse the repository at this point in the history
  • Loading branch information
niamster committed Feb 11, 2015
1 parent 6bdf2c1 commit c56dc14
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 22 deletions.
6 changes: 3 additions & 3 deletions lib/dcell/actor_proxy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ module DCell
class ActorProxy
include Celluloid

def initialize(lnode, rmailbox, methods)
@lnode, @rmailbox = lnode, rmailbox
def initialize(lnode, actor, methods)
@lnode, @actor = lnode, actor
methods.each do |meth|
self.class.send(:define_method, meth) do |*args, &block|
begin
Expand All @@ -18,7 +18,7 @@ def initialize(lnode, rmailbox, methods)

private
def ______method_missing(meth, *args, &block)
message = {:mailbox => @rmailbox, :meth => meth, :args => args, :block => block_given?}
message = {:actor => @actor, :meth => meth, :args => args, :block => block_given?}
begin
res = @lnode.relay message
if block_given?
Expand Down
23 changes: 7 additions & 16 deletions lib/dcell/messages.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,11 @@ def initialize(sender, name)

def dispatch
actor = DCell.get_local_actor @name
mailbox, methods = nil, nil
methods = nil
if actor
mailbox, methods = actor.mailbox, actor.class.instance_methods(false)
methods = actor.class.instance_methods(false)
end
respond SuccessResponse.new(@id, @sender[:address], [mailbox, methods])
respond SuccessResponse.new(@id, @sender[:address], methods)
end

def to_msgpack(pk=nil)
Expand Down Expand Up @@ -96,29 +96,20 @@ def initialize(sender, message)
@sender, @message = sender, message
end

def find_actor(mailbox)
::Thread.list.each do |t|
if actor = t[:celluloid_actor]
return actor if actor.mailbox.address == mailbox[:address]
end
end
nil
end

def __dispatch(actor)
value = nil
if message[:block]
Celluloid::Actor::call actor.mailbox, message[:meth], *message[:args] {|v| value = v}
if @message[:block]
Celluloid::Actor::call actor.mailbox, @message[:meth], *@message[:args] {|v| value = v}
else
value = Celluloid::Actor::call actor.mailbox, message[:meth], *message[:args]
value = Celluloid::Actor::call actor.mailbox, @message[:meth], *@message[:args]
end
SuccessResponse.new(@id, @sender[:address], value)
rescue => e
ErrorResponse.new(@id, @sender[:address], {:class => RuntimeError.name, :msg => e.to_s})
end

def dispatch
actor = find_actor(message[:mailbox])
actor = DCell.get_local_actor @message[:actor].to_sym
if actor
rsp = __dispatch actor
else
Expand Down
6 changes: 3 additions & 3 deletions lib/dcell/node.rb
Original file line number Diff line number Diff line change
Expand Up @@ -164,9 +164,9 @@ def send_request(request)
# Find an call registered with a given name on this node
def find(name)
request = Message::Find.new(Thread.mailbox, name)
mailbox, methods = send_request request
return nil if mailbox.kind_of? NilClass
actor = DCell::ActorProxy.new self, mailbox, methods
methods = send_request request
return nil if methods.kind_of? NilClass
actor = DCell::ActorProxy.new self, name, methods
add_actor actor
end
alias_method :[], :find
Expand Down

0 comments on commit c56dc14

Please sign in to comment.