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
-
#fetch_instance(impl, attachment_method = nil) ⇒ Object
Retrieves the wrapper object with the supplied Proton struct.
- #get_key(impl) ⇒ Object
-
#store_instance(object, attachment_method = nil) ⇒ Object
Stores the given object for later retrieval.
Instance Method Details
#fetch_instance(impl, attachment_method = nil) ⇒ Object
Retrieves the wrapper object with the supplied Proton struct.
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, = 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 .nil? record = Cproton.__send__(, 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.
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, = 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 .nil? record = Cproton.__send__(, 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 |