Sha256: f0eaf17990b811863ef5277521250dc17a471e7b920ecdaf59919847fe953f8f

Contents?: true

Size: 1.33 KB

Versions: 1

Compression:

Stored size: 1.33 KB

Contents

require 'weakref'

module DCell
  # Route incoming messages to their recipient actors
  class Router
    @mutex     = Mutex.new
    @addresses = {}
    @mailboxes = {}

    class << self
      # Enter a mailbox into the registry
      def register(mailbox)
        @mutex.lock
        begin
          address = @addresses[mailbox.object_id]
          unless address
            address = Celluloid.uuid
            @addresses[mailbox.object_id] = address
          end

          ref = @mailboxes[address]
          @mailboxes[address] = WeakRef.new(mailbox) unless ref && ref.weakref_alive?

          address
        ensure
          @mutex.unlock rescue nil
        end
      end

      # Find a mailbox by its address
      def find(mailbox_address)
        @mutex.lock
        begin
          ref = @mailboxes[mailbox_address]
          return unless ref
          ref.__getobj__
        rescue WeakRef::RefError
          # The referenced actor is dead, so prune the registry
          @mailboxes.delete mailbox_address
          nil
        ensure
          @mutex.unlock rescue nil
        end
      end

      # Prune all entries that point to dead objects
      def gc
        @mutex.synchronize do
          @mailboxes.each do |id, ref|
            @mailboxes.delete id unless ref.weakref_alive?
          end
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dcell-0.12.0.pre lib/dcell/router.rb