Module: Qpid::Proton::Util::Wrapper::ClassMethods

Defined in:
lib/util/wrapper.rb

Overview

Adds methods to the target class for storing and retrieving pure Ruby wrappers to underlying Proton structures.

Such wrappers are stored in a registry using a key. The key is then attached to the Proton structure as a record. That record lives for as long as the Proton structure lives, and when the structure is released the record acts as hook to also delete the Ruby wrapper object from the registry.

Instance Method Summary collapse

Instance Method Details

#fetch_instance(impl, attachment_method = nil) ⇒ Object

Retrieves the wrapper object with the supplied Proton struct.

Parameters:

  • impl (Object)

    The wrapper for the Proton struct.

  • attachment_method (Symbol) (defaults to: nil)

    The Proton attachment method.

Returns:

  • (Object)

    The Ruby wrapper object.



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/util/wrapper.rb', line 89

def fetch_instance(impl, attachment_method = nil)
  # if the impl has a wrapper already attached, then return it
  if impl.instance_variable_defined?(:@proton_wrapper)
    return impl.instance_variable_get(:@proton_wrapper)
  end
  unless attachment_method.nil?
    record = Cproton.__send__(attachment_method, impl)
    rbkey = Cproton.pni_void2rbkey(Cproton.pn_record_get(record, RBCTX))
    # if we don't have a key, then we don't have an object
    return nil if rbkey.nil?
    registry_key = Cproton.Pn_rbkey_get_key_value(rbkey)
  else
    registry_key = get_key(impl)
  end
  # if the object's not in the registry then return
  return nil unless Qpid::Proton::Util::Wrapper.registry.has_key?(registry_key)

  result = Qpid::Proton::Util::Wrapper.registry[registry_key]
  # result = nil unless result.weakref_alive?
  if result.nil?
    raise Qpid::Proton::ProtonError.new("missing object for key=#{registry_key}")
  else
    # update the impl since the Swig wrapper for it may have changed
    result.impl = impl
  end
  return result
end

#get_key(impl) ⇒ Object



57
58
59
# File 'lib/util/wrapper.rb', line 57

def get_key(impl)
  ("%032x" % Cproton.pni_address_of(impl))
end

#store_instance(object, attachment_method = nil) ⇒ Object

Stores the given object for later retrieval.

Parameters:

  • object (Object)

    The object.

  • attachment_method (Symbol) (defaults to: nil)

    The Proton attachment method.



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/util/wrapper.rb', line 66

def store_instance(object, attachment_method = nil)
  # ensure the impl has a reference to the wrapper object
  object.impl.instance_eval { @proton_wrapper = object }
  registry_key = get_key(object.impl)
  unless attachment_method.nil?
    record = Cproton.__send__(attachment_method, object.impl)
    rbkey = Cproton.Pn_rbkey_new
    Cproton.Pn_rbkey_set_registry(rbkey, Cproton.pn_rb2void(Qpid::Proton::Util::Wrapper.registry))
    Cproton.Pn_rbkey_set_method(rbkey, "delete")
    Cproton.Pn_rbkey_set_key_value(rbkey, registry_key)
    Cproton.pn_record_def(record, RBCTX, Cproton.Pn_rbkey__class());
    Cproton.pn_record_set(record, RBCTX, rbkey)
  end
  Qpid::Proton::Util::Wrapper.registry[registry_key] = object
end