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