You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by mc...@apache.org on 2015/06/03 22:30:52 UTC

[15/34] qpid-proton git commit: PROTON-799: Added the Wrapper mixin to the Ruby engine APIs.

PROTON-799: Added the Wrapper mixin to the Ruby engine APIs.


Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/38ce7eec
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/38ce7eec
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/38ce7eec

Branch: refs/heads/master
Commit: 38ce7eec6ec2e0ba818ac9df6f6da696ef358b62
Parents: b846f25
Author: Darryl L. Pierce <mc...@gmail.com>
Authored: Fri Jan 16 16:06:44 2015 -0500
Committer: Darryl L. Pierce <mc...@gmail.com>
Committed: Wed Jun 3 16:29:22 2015 -0400

----------------------------------------------------------------------
 proton-c/bindings/ruby/lib/qpid_proton.rb  |   1 +
 proton-c/bindings/ruby/lib/util/wrapper.rb | 124 ++++++++++++++++++++++++
 2 files changed, 125 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/38ce7eec/proton-c/bindings/ruby/lib/qpid_proton.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/qpid_proton.rb b/proton-c/bindings/ruby/lib/qpid_proton.rb
index 99d9dfc..507b61f 100644
--- a/proton-c/bindings/ruby/lib/qpid_proton.rb
+++ b/proton-c/bindings/ruby/lib/qpid_proton.rb
@@ -35,6 +35,7 @@ require "util/error_handler"
 require "util/constants"
 require "util/swig_helper"
 require "util/condition"
+require "util/wrapper"
 require "util/engine"
 require "util/uuid"
 

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/38ce7eec/proton-c/bindings/ruby/lib/util/wrapper.rb
----------------------------------------------------------------------
diff --git a/proton-c/bindings/ruby/lib/util/wrapper.rb b/proton-c/bindings/ruby/lib/util/wrapper.rb
new file mode 100644
index 0000000..a2df413
--- /dev/null
+++ b/proton-c/bindings/ruby/lib/util/wrapper.rb
@@ -0,0 +1,124 @@
+#--
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#++
+
+module Qpid::Proton::Util
+
+  # @private
+  module Wrapper
+
+    # @private
+    def impl=(impl)
+      @impl = impl
+    end
+
+    # @private
+    def impl
+      @impl
+    end
+
+    def self.registry
+      @registry ||= {}
+    end
+
+    def self.included(base)
+      base.extend(ClassMethods)
+    end
+
+    # 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.
+    #
+    # @private
+    #
+    module ClassMethods
+
+      # @private
+      def get_key(impl)
+        ("%032x" % Cproton.pni_address_of(impl))
+      end
+
+      # Stores the given object for later retrieval.
+      #
+      # @param object [Object] The object.
+      # @param attachment_method [Symbol] The Proton attachment method.
+      #
+      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
+
+      # Retrieves the wrapper object with the supplied Proton struct.
+      #
+      # @param impl [Object] The wrapper for the Proton struct.
+      # @param attachment_method [Symbol] The Proton attachment method.
+      #
+      # @return [Object] The Ruby wrapper object.
+      #
+      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
+
+    end
+
+  end
+
+  # @private
+  RBCTX = Wrapper.hash.to_i
+
+end


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org