Sha256: 4ed9f3ab3ead7e7b1ac6b1f61fda837fb76f2e59a2d8f00d6e2fe036a474f41c

Contents?: true

Size: 1.32 KB

Versions: 9

Compression:

Stored size: 1.32 KB

Contents

require 'drb'

if defined?(JRUBY_VERSION)
  require 'jruby'

  require 'weakref'
  class DRb::WeakRefDRbIdConv

    def initialize
      @id2ref = {}
    end

    # Convert an object reference id to an object.
    #
    # This implementation looks up the reference id in the local object
    # space and returns the object it refers to.
    def to_obj(ref)
      _get(ref) || super
    end

    # Convert an object into a reference id.
    #
    # This implementation returns the object's __id__ in the local
    # object space.
    def to_id(obj)
      (obj.nil? ? nil : _put(obj)) || super
    end

    def _clean
      dead = []
      @id2ref.each {|id,weakref| dead << id unless weakref.weakref_alive?}
      dead.each {|id| @id2ref.delete(id)}
    end

    def _put(obj)
      _clean
      @id2ref[obj.__id__] = WeakRef.new(obj)
      obj.__id__
    end

    def _get(id)
      weakref = @id2ref[id]
      if weakref
        result = weakref.__getobj__ rescue nil
        if result
          return result
        else
          @id2ref.delete id
        end
      end
      nil
    end
    private :_clean, :_put, :_get

  end

  # NOTE: the same default object id converter #DRb::DRbIdConv as in 1.8 mode
  # (not relying on ObjectSpace which is what #DRb::DRbIdConv does in 1.9) :
  DRb::DRbServer.default_id_conv(DRb::WeakRefDRbIdConv.new)

end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
warbler-2.0.2 spec/drb_default_id_conv.rb
warbler-2.0.1 spec/drb_default_id_conv.rb
warbler-2.0.0 spec/drb_default_id_conv.rb
warbler-2.0.0.rc3 spec/drb_default_id_conv.rb
warbler-2.0.0.rc2 spec/drb_default_id_conv.rb
warbler-2.0.0.rc1 spec/drb_default_id_conv.rb
warbler-2.0.0.pre3 spec/drb_default_id_conv.rb
warbler-2.0.0.pre2 spec/drb_default_id_conv.rb
warbler-2.0.0.pre1 spec/drb_default_id_conv.rb