diff --git a/lib/dcell.rb b/lib/dcell.rb index 59c8e90..c9f84fa 100644 --- a/lib/dcell.rb +++ b/lib/dcell.rb @@ -29,7 +29,8 @@ module DCell class NotConfiguredError < RuntimeError; end # Not configured yet - @config_lock = Mutex.new + @lock = Mutex.new + @actors = Set.new def self.included(base) base.extend(ClassMethods) @@ -47,7 +48,7 @@ def setup(options = {}) # Stringify keys :/ options = options.inject({}) { |h,(k,v)| h[k.to_s] = v; h } - @config_lock.synchronize do + @lock.synchronize do @configuration = { 'addr' => "tcp://127.0.0.1:*", 'heartbeat_rate' => 5, @@ -65,6 +66,24 @@ def setup(options = {}) me end + def add_actor(name) + @lock.synchronize do + @actors << name.to_sym + end + end + + def get_actor(name) + name = name.to_sym + if @actors.include? name + return Celluloid::Actor[name] + end + nil + end + + def actors + @actors.to_a + end + def config(option) unless @configuration Logger.warn "DCell unconfigured, can't get #{option}" @@ -132,6 +151,7 @@ class SupervisionGroup < Celluloid::SupervisionGroup supervise Server, :as => :dcell_server, :args => [DCell] supervise InfoService, :as => :info end + DCell.add_actor :info Logger = Celluloid::Logger end diff --git a/lib/dcell/celluloid_ext.rb b/lib/dcell/celluloid_ext.rb index afc9778..a16c986 100644 --- a/lib/dcell/celluloid_ext.rb +++ b/lib/dcell/celluloid_ext.rb @@ -19,6 +19,13 @@ def to_msgpack(pk=nil) end end + module ClassMethods + def supervise_as(name, *args, &block) + DCell.add_actor name + Supervisor.supervise_as(name, self, *args, &block) + end + end + class CellProxy alias_method :____async, :async def async(meth = nil, *args, &block) diff --git a/lib/dcell/messages.rb b/lib/dcell/messages.rb index 6096ca9..6ddd22b 100644 --- a/lib/dcell/messages.rb +++ b/lib/dcell/messages.rb @@ -39,7 +39,7 @@ def initialize(sender, name) end def dispatch - actor = Celluloid::Actor[@name] + actor = DCell.get_actor @name mailbox, methods = nil, nil if actor mailbox, methods = actor.mailbox, actor.class.instance_methods(false) @@ -66,7 +66,7 @@ def initialize(sender) end def dispatch - Node[@sender[:id]] << SuccessResponse.new(@id, @sender[:address], Celluloid::Actor.registered) + Node[@sender[:id]] << SuccessResponse.new(@id, @sender[:address], DCell.actors) end def to_msgpack(pk=nil) diff --git a/spec/support/dcell_mock.rb b/spec/support/dcell_mock.rb index f2bf32e..5b4c4e6 100644 --- a/spec/support/dcell_mock.rb +++ b/spec/support/dcell_mock.rb @@ -1,4 +1,4 @@ module DCellMock - @config_lock = Mutex.new + @lock = Mutex.new include DCell end