Sha256: 74828fb6d451e68b7519216dc0d53bb5633a5e4fd680d3915bc1cd554116dd6b

Contents?: true

Size: 1.59 KB

Versions: 50

Compression:

Stored size: 1.59 KB

Contents

module Universa

  # The smarter and safer weak reference than a standard one.
  # It keeps object_id even if it is GC'd and can create a hard
  # reference when possible. Some code borrowed from
  # https://github.com/ruby-concurrency/ref.
  #
  # Note there is no +alive?+ method because it is not thread safe.
  # Use the safe approach:
  #
  #     weak = WeakReference.new(something)
  #     hard = weak.get
  #     if hard
  #        # we got safe reference in +hard+
  #     end
  #
  # or, scala/kotlin-style:
  #
  #     weak.let { |object|
  #       object.do_somethinf
  #     }
  #
  class WeakReference

    # ruby object it of the referenced object. Available also after object is recycled.
    attr :referenced_object_id

    # Create weak reference for a given object
    def initialize(object)
      @referenced_object_id = object.__id__
      @weakref = WeakRef.new(object)
    end

    # Call the block passing it hard ref to the object if it is not yet recycled
    #
    # @return what the block returned or nil
    # @yield object if it is not recycled
    def let
      if (hardref = object.get)
        yield hardref
      else
        nil
      end
    end

    # Get the strong reference unless it is already reclaimed.
    #
    # @return [Object] har reference to the source object or nil
    def get
      @weakref.__getobj__
    rescue => e
      # Jruby implementation uses RefError while MRI uses WeakRef::RefError
      if (defined?(RefError) && e.is_a?(RefError)) || (defined?(::WeakRef::RefError) && e.is_a?(::WeakRef::RefError))
        nil
      else
        raise e
      end
    end
  end
end

Version data entries

50 entries across 50 versions & 1 rubygems

Version Path
universa-3.14.5 lib/universa/weak_reference.rb
universa-3.14.4 lib/universa/weak_reference.rb
universa-3.14.3 lib/universa/weak_reference.rb
universa-3.14.2.4 lib/universa/weak_reference.rb
universa-3.14.2.2 lib/universa/weak_reference.rb
universa-3.14.2.1 lib/universa/weak_reference.rb
universa-3.13.2.2 lib/universa/weak_reference.rb
universa-3.13.2.1 lib/universa/weak_reference.rb
universa-3.13.1.1 lib/universa/weak_reference.rb
universa-3.12.6.1 lib/universa/weak_reference.rb
universa-3.12.4.1 lib/universa/weak_reference.rb
universa-3.12.0.2 lib/universa/weak_reference.rb
universa-3.11.4.4 lib/universa/weak_reference.rb
universa-3.11.4.3 lib/universa/weak_reference.rb
universa-3.11.4.2 lib/universa/weak_reference.rb
universa-3.11.4.1 lib/universa/weak_reference.rb
universa-3.11.3.1 lib/universa/weak_reference.rb
universa-3.10.5.3 lib/universa/weak_reference.rb
universa-3.10.5.1 lib/universa/weak_reference.rb
universa-3.10.2.1 lib/universa/weak_reference.rb