You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2022/05/13 14:24:08 UTC

[qpid-proton] 04/09: PROTON-2542: Flatten out all direct pn_ object operations

This is an automated email from the ASF dual-hosted git repository.

astitcher pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-proton.git

commit cd417188ac938ecfb0b10bf7b5f99e234a2e6a51
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Tue Apr 26 16:39:00 2022 -0400

    PROTON-2542: Flatten out all direct pn_ object operations
    
    Flattened out: pn_incref, pn_decref, pn_refcount, pn_free, pn_class,
    pn_hashcode, pn_compare, pn_inspect. This avoids much calling overhead.
---
 c/src/core/object/object.c | 95 ++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 87 insertions(+), 8 deletions(-)

diff --git a/c/src/core/object/object.c b/c/src/core/object/object.c
index 13686a2f..a664150d 100644
--- a/c/src/core/object/object.c
+++ b/c/src/core/object/object.c
@@ -225,37 +225,101 @@ void pn_object_free(void *object)
 
 void *pn_incref(void *object)
 {
-  return pn_class_incref(PN_OBJECT, object);
+  if (object) {
+    const pn_class_t *clazz = pni_head(object)->clazz;
+    clazz->incref(object);
+  }
+  return object;
 }
 
 int pn_decref(void *object)
 {
-  return pn_class_decref(PN_OBJECT, object);
+  if (object) {
+    const pn_class_t *clazz = pni_head(object)->clazz;
+    clazz->decref(object);
+    int rc = clazz->refcount(object);
+    if (rc == 0) {
+      if (clazz->finalize) {
+        clazz->finalize(object);
+        // check the refcount again in case the finalizer created a
+        // new reference
+        rc = clazz->refcount(object);
+      }
+      if (rc == 0) {
+        clazz->free(object);
+        return 0;
+      }
+    } else {
+      return rc;
+    }
+  }
+  return 0;
 }
 
 int pn_refcount(void *object)
 {
-  return pn_class_refcount(PN_OBJECT, object);
+  assert(object);
+  const pn_class_t *clazz = pni_head(object)->clazz;
+  return clazz->refcount(object);
 }
 
 void pn_free(void *object)
 {
-  pn_class_free(PN_OBJECT, object);
+  if (object) {
+    const pn_class_t *clazz = pni_head(object)->clazz;
+    int rc = clazz->refcount(object);
+    assert(rc == 1 || rc == -1);
+    if (rc == 1) {
+      clazz->decref(object);
+      assert(clazz->refcount(object) == 0);
+      if (clazz->finalize) {
+        clazz->finalize(object);
+      }
+      if (clazz->refcount(object) == 0) {
+        clazz->free(object);
+      }
+    } else {
+      if (clazz->finalize) {
+        clazz->finalize(object);
+      }
+      clazz->free(object);
+    }
+  }
 }
 
 const pn_class_t *pn_class(void *object)
 {
-  return pn_class_reify(PN_OBJECT, object);
+  if (object) {
+    return pni_head(object)->clazz;
+  } else {
+    return PN_OBJECT;
+  }
 }
 
 uintptr_t pn_hashcode(void *object)
 {
-  return pn_class_hashcode(PN_OBJECT, object);
+  if (!object) return 0;
+
+  const pn_class_t *clazz = pni_head(object)->clazz;
+
+  if (clazz->hashcode) {
+    return clazz->hashcode(object);
+  } else {
+    return (uintptr_t) object;
+  }
 }
 
 intptr_t pn_compare(void *a, void *b)
 {
-  return pn_class_compare(PN_OBJECT, a, b);
+  if (a == b) return 0;
+
+  if (a && b) {
+    const pn_class_t *clazz = pni_head(a)->clazz;
+    if (clazz->compare) {
+      return clazz->compare(a, b);
+    }
+  }
+  return (intptr_t) a - (intptr_t) b;
 }
 
 bool pn_equals(void *a, void *b)
@@ -265,7 +329,22 @@ bool pn_equals(void *a, void *b)
 
 int pn_inspect(void *object, pn_string_t *dst)
 {
-  return pn_class_inspect(PN_OBJECT, object, dst);
+  if (!pn_string_get(dst)) {
+    pn_string_set(dst, "");
+  }
+
+  if (!object) {
+    return pn_string_addf(dst, "pn_object<%p>", object);
+  }
+
+  const pn_class_t *clazz = pni_head(object)->clazz;
+
+  if (clazz->inspect) {
+    return clazz->inspect(object, dst);
+  }
+
+  const char *name = clazz->name ? clazz->name : "<anon>";
+  return pn_string_addf(dst, "%s<%p>", name, object);
 }
 
 #define pn_weakref_new NULL


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