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 08668d8043ac89f7880e29792d49e7267f572d94 Author: Andrew Stitcher <[email protected]> AuthorDate: Tue Apr 26 16:43:29 2022 -0400 PROTON-2542: Remove reify operation Turns out the reify operation is really asking the question "What is my real class?" And it's only useful if the class is PN_OBJECT. So instead of adding a whole sepearate operation and lookup we can just check if the class if PN_OBJECT and if it is look up the "real" class. --- c/include/proton/object.h | 16 -------- c/src/core/engine.c | 3 -- c/src/core/event.c | 6 ++- c/src/core/object/map.c | 6 --- c/src/core/object/object.c | 96 ++++++++++++++++---------------------------- c/src/core/transport.c | 1 - c/src/proactor/epoll_timer.c | 3 -- c/src/reactor/reactor.c | 2 +- 8 files changed, 40 insertions(+), 93 deletions(-) diff --git a/c/include/proton/object.h b/c/include/proton/object.h index fe790631..0412c393 100644 --- a/c/include/proton/object.h +++ b/c/include/proton/object.h @@ -59,7 +59,6 @@ struct pn_class_t { int (*refcount)(void *); void (*finalize)(void *); void (*free)(void *); - const pn_class_t *(*reify)(void *); uintptr_t (*hashcode)(void *); intptr_t (*compare)(void *, void *); int (*inspect)(void *, pn_string_t *); @@ -83,7 +82,6 @@ PN_EXTERN extern const pn_class_t PN_WEAKREF[]; pn_object_refcount, \ PREFIX ## _finalize, \ pn_object_free, \ - pn_object_reify, \ PREFIX ## _hashcode, \ PREFIX ## _compare, \ PREFIX ## _inspect \ @@ -99,7 +97,6 @@ PN_EXTERN extern const pn_class_t PN_WEAKREF[]; PREFIX ## _refcount, \ PREFIX ## _finalize, \ PREFIX ## _free, \ - PREFIX ## _reify, \ PREFIX ## _hashcode, \ PREFIX ## _compare, \ PREFIX ## _inspect \ @@ -107,7 +104,6 @@ PN_EXTERN extern const pn_class_t PN_WEAKREF[]; /* Class to identify a plain C struct in a pn_event_t. No refcounting or memory management. */ #define PN_STRUCT_CLASSDEF(PREFIX) \ -static const pn_class_t *PREFIX ## _reify(void *p); \ const pn_class_t PN_CLASSCLASS(PREFIX)[] = {{ \ #PREFIX, \ CID_ ## PREFIX, \ @@ -118,14 +114,10 @@ const pn_class_t PN_CLASSCLASS(PREFIX)[] = {{ \ pn_void_refcount, \ NULL, /* _finalize */ \ NULL, /* _free */ \ - PREFIX ## _reify, \ pn_void_hashcode, \ pn_void_compare, \ pn_void_inspect \ }}; \ -const pn_class_t *PREFIX ## _reify(void *p) { \ - return PN_CLASSCLASS(PREFIX); \ -} PN_EXTERN pn_cid_t pn_class_id(const pn_class_t *clazz); PN_EXTERN const char *pn_class_name(const pn_class_t *clazz); @@ -143,8 +135,6 @@ PN_EXTERN int pn_class_decref(const pn_class_t *clazz, void *object); PN_EXTERN void pn_class_free(const pn_class_t *clazz, void *object); -PN_EXTERN const pn_class_t *pn_class_reify(const pn_class_t *clazz, void *object); -PN_EXTERN uintptr_t pn_class_hashcode(const pn_class_t *clazz, void *object); PN_EXTERN intptr_t pn_class_compare(const pn_class_t *clazz, void *a, void *b); PN_EXTERN bool pn_class_equals(const pn_class_t *clazz, void *a, void *b); PN_EXTERN int pn_class_inspect(const pn_class_t *clazz, void *object, pn_string_t *dst); @@ -158,7 +148,6 @@ PN_EXTERN intptr_t pn_void_compare(void *a, void *b); PN_EXTERN int pn_void_inspect(void *object, pn_string_t *dst); PN_EXTERN void *pn_object_new(const pn_class_t *clazz, size_t size); -PN_EXTERN const pn_class_t *pn_object_reify(void *object); PN_EXTERN void pn_object_incref(void *object); PN_EXTERN int pn_object_refcount(void *object); PN_EXTERN void pn_object_decref(void *object); @@ -174,8 +163,6 @@ PN_EXTERN intptr_t pn_compare(void *a, void *b); PN_EXTERN bool pn_equals(void *a, void *b); PN_EXTERN int pn_inspect(void *object, pn_string_t *dst); -#define PN_REFCOUNT (0x1) - PN_EXTERN pn_list_t *pn_list(const pn_class_t *clazz, size_t capacity); PN_EXTERN size_t pn_list_size(pn_list_t *list); PN_EXTERN void *pn_list_get(pn_list_t *list, int index); @@ -190,9 +177,6 @@ PN_EXTERN void pn_list_iterator(pn_list_t *list, pn_iterator_t *iter); PN_EXTERN void pn_list_minpush(pn_list_t *list, void *value); PN_EXTERN void *pn_list_minpop(pn_list_t *list); -#define PN_REFCOUNT_KEY (0x2) -#define PN_REFCOUNT_VALUE (0x4) - PN_EXTERN pn_map_t *pn_map(const pn_class_t *key, const pn_class_t *value, size_t capacity, float load_factor); PN_EXTERN size_t pn_map_size(pn_map_t *map); diff --git a/c/src/core/engine.c b/c/src/core/engine.c index e5f64497..1f25aadd 100644 --- a/c/src/core/engine.c +++ b/c/src/core/engine.c @@ -980,7 +980,6 @@ static void pn_session_finalize(void *object) #define pn_session_new pn_object_new #define pn_session_refcount pn_object_refcount #define pn_session_decref pn_object_decref -#define pn_session_reify pn_object_reify #define pn_session_initialize NULL #define pn_session_hashcode NULL #define pn_session_compare NULL @@ -1149,7 +1148,6 @@ static void pn_link_finalize(void *object) #define pn_link_refcount pn_object_refcount #define pn_link_decref pn_object_decref -#define pn_link_reify pn_object_reify #define pn_link_initialize NULL #define pn_link_hashcode NULL #define pn_link_compare NULL @@ -1513,7 +1511,6 @@ static void pn_disposition_clear(pn_disposition_t *ds) #define pn_delivery_refcount pn_object_refcount #define pn_delivery_decref pn_object_decref #define pn_delivery_free pn_object_free -#define pn_delivery_reify pn_object_reify #define pn_delivery_initialize NULL #define pn_delivery_hashcode NULL #define pn_delivery_compare NULL diff --git a/c/src/core/event.c b/c/src/core/event.c index 428fc10e..5afd45cd 100644 --- a/c/src/core/event.c +++ b/c/src/core/event.c @@ -142,8 +142,6 @@ pn_event_t *pn_collector_put(pn_collector_t *collector, return NULL; } - clazz = clazz->reify(context); - pn_event_t *event = (pn_event_t *) pn_list_pop(collector->pool); if (!event) { @@ -161,6 +159,10 @@ pn_event_t *pn_collector_put(pn_collector_t *collector, collector->head = event; } + if (clazz==PN_OBJECT) { + clazz = pn_class(context); + } + event->clazz = clazz; event->context = context; event->type = type; diff --git a/c/src/core/object/map.c b/c/src/core/object/map.c index ee306acb..38d64547 100644 --- a/c/src/core/object/map.c +++ b/c/src/core/object/map.c @@ -396,7 +396,6 @@ static bool pni_identity_equals(void *a, void *b) } #define CID_pni_uintptr CID_pn_void -static const pn_class_t *pni_uintptr_reify(void *object); #define pni_uintptr_new NULL #define pni_uintptr_free NULL #define pni_uintptr_initialize NULL @@ -410,11 +409,6 @@ static int pni_uintptr_refcount(void *object) { return -1; } static const pn_class_t PN_UINTPTR[] = {PN_METACLASS(pni_uintptr)}; -static const pn_class_t *pni_uintptr_reify(void *object) -{ - return PN_UINTPTR; -} - pn_hash_t *pn_hash(const pn_class_t *clazz, size_t capacity, float load_factor) { pn_hash_t *hash = (pn_hash_t *) pn_map(PN_UINTPTR, clazz, capacity, load_factor); diff --git a/c/src/core/object/object.c b/c/src/core/object/object.c index 7164627d..13686a2f 100644 --- a/c/src/core/object/object.c +++ b/c/src/core/object/object.c @@ -41,13 +41,20 @@ void pn_void_decref(void* p) {} int pn_void_refcount(void *object) { return -1; } #define pn_void_finalize NULL static void pn_void_free(void *object) { pni_mem_deallocate(PN_VOID, object); } -static const pn_class_t *pn_void_reify(void *object) { return PN_VOID; } uintptr_t pn_void_hashcode(void *object) { return (uintptr_t) object; } intptr_t pn_void_compare(void *a, void *b) { return (intptr_t) a - (intptr_t) b; } int pn_void_inspect(void *object, pn_string_t *dst) { return pn_string_addf(dst, "%p", object); } const pn_class_t PN_VOID[] = {PN_METACLASS(pn_void)}; +typedef struct { + const pn_class_t *clazz; + int refcount; +} pni_head_t; + +#define pni_head(PTR) \ +(((pni_head_t *) (PTR)) - 1) + const char *pn_class_name(const pn_class_t *clazz) { return clazz->name; @@ -70,9 +77,11 @@ void *pn_class_new(const pn_class_t *clazz, size_t size) void *pn_class_incref(const pn_class_t *clazz, void *object) { - assert(clazz); if (object) { - clazz = clazz->reify(object); + if (clazz==PN_OBJECT) { + clazz = pni_head(object)->clazz; + } + clazz->incref(object); } return object; @@ -80,17 +89,20 @@ void *pn_class_incref(const pn_class_t *clazz, void *object) int pn_class_refcount(const pn_class_t *clazz, void *object) { - assert(clazz); - clazz = clazz->reify(object); + if (clazz==PN_OBJECT) { + clazz = pn_class(object); + } + return clazz->refcount(object); } int pn_class_decref(const pn_class_t *clazz, void *object) { - assert(clazz); - if (object) { - clazz = clazz->reify(object); + if (clazz==PN_OBJECT) { + clazz = pni_head(object)->clazz; + } + clazz->decref(object); int rc = clazz->refcount(object); if (rc == 0) { @@ -114,9 +126,11 @@ int pn_class_decref(const pn_class_t *clazz, void *object) void pn_class_free(const pn_class_t *clazz, void *object) { - assert(clazz); if (object) { - clazz = clazz->reify(object); + if (clazz==PN_OBJECT) { + clazz = pni_head(object)->clazz; + } + int rc = clazz->refcount(object); assert(rc == 1 || rc == -1); if (rc == 1) { @@ -131,40 +145,19 @@ void pn_class_free(const pn_class_t *clazz, void *object) } } -const pn_class_t *pn_class_reify(const pn_class_t *clazz, void *object) -{ - assert(clazz); - return clazz->reify(object); -} - -uintptr_t pn_class_hashcode(const pn_class_t *clazz, void *object) -{ - assert(clazz); - - if (!object) return 0; - - clazz = clazz->reify(object); - - if (clazz->hashcode) { - return clazz->hashcode(object); - } else { - return (uintptr_t) object; - } -} - intptr_t pn_class_compare(const pn_class_t *clazz, void *a, void *b) { - assert(clazz); - if (a == b) return 0; - clazz = clazz->reify(a); - - if (a && b && clazz->compare) { - return clazz->compare(a, b); - } else { - return (intptr_t) a - (intptr_t) b; + if (a && b) { + if (clazz==PN_OBJECT) { + clazz = pni_head(a)->clazz; + } + if (clazz->compare) { + return clazz->compare(a, b); + } } + return (intptr_t) a - (intptr_t) b; } bool pn_class_equals(const pn_class_t *clazz, void *a, void *b) @@ -174,9 +167,9 @@ bool pn_class_equals(const pn_class_t *clazz, void *a, void *b) int pn_class_inspect(const pn_class_t *clazz, void *object, pn_string_t *dst) { - assert(clazz); - - clazz = clazz->reify(object); + if (clazz==PN_OBJECT) { + clazz = pni_head(object)->clazz; + } if (!pn_string_get(dst)) { pn_string_set(dst, ""); @@ -191,14 +184,6 @@ int pn_class_inspect(const pn_class_t *clazz, void *object, pn_string_t *dst) return pn_string_addf(dst, "%s<%p>", name, object); } -typedef struct { - const pn_class_t *clazz; - int refcount; -} pni_head_t; - -#define pni_head(PTR) \ - (((pni_head_t *) (PTR)) - 1) - void *pn_object_new(const pn_class_t *clazz, size_t size) { void *object = NULL; @@ -211,14 +196,6 @@ void *pn_object_new(const pn_class_t *clazz, size_t size) return object; } -const pn_class_t *pn_object_reify(void *object) -{ - if (object) { - return pni_head(object)->clazz; - } else { - return PN_OBJECT; - } -} void pn_object_incref(void *object) { @@ -299,9 +276,6 @@ int pn_inspect(void *object, pn_string_t *dst) static void pn_weakref_incref(void *object) {} static void pn_weakref_decref(void *object) {} static int pn_weakref_refcount(void *object) { return -1; } -static const pn_class_t *pn_weakref_reify(void *object) { - return PN_WEAKREF; -} static uintptr_t pn_weakref_hashcode(void *object) { return pn_hashcode(object); } diff --git a/c/src/core/transport.c b/c/src/core/transport.c index 49d15d07..0e101982 100644 --- a/c/src/core/transport.c +++ b/c/src/core/transport.c @@ -538,7 +538,6 @@ static void pn_transport_finalize(void *object); #define pn_transport_new pn_object_new #define pn_transport_refcount pn_object_refcount #define pn_transport_decref pn_object_decref -#define pn_transport_reify pn_object_reify #define pn_transport_hashcode NULL #define pn_transport_compare NULL #define pn_transport_inspect NULL diff --git a/c/src/proactor/epoll_timer.c b/c/src/proactor/epoll_timer.c index 4a68ce1c..8a6f98b3 100644 --- a/c/src/proactor/epoll_timer.c +++ b/c/src/proactor/epoll_timer.c @@ -83,8 +83,6 @@ typedef struct timer_deadline_t { bool resequenced; // An out-of-order connection timeout caught and handled. } timer_deadline_t; -static const pn_class_t *timer_deadline_reify(void *p); - // The pn_list_t calls this to maintain its sorted heap. static intptr_t timer_deadline_compare(void *oa, void *ob) { timer_deadline_t *a = (timer_deadline_t *) oa; @@ -104,7 +102,6 @@ static intptr_t timer_deadline_compare(void *oa, void *ob) { #define timer_deadline_inspect NULL static const pn_class_t timer_deadline_clazz = PN_METACLASS(timer_deadline); -static const pn_class_t *timer_deadline_reify(void *p) { return &timer_deadline_clazz; } static timer_deadline_t* timer_deadline_t_new(void) { // Just the struct. Not a Proton class based object. diff --git a/c/src/reactor/reactor.c b/c/src/reactor/reactor.c index 27f2c717..b1326739 100644 --- a/c/src/reactor/reactor.c +++ b/c/src/reactor/reactor.c @@ -310,7 +310,7 @@ pn_reactor_t *pn_class_reactor(const pn_class_t *clazz, void *object) { } pn_reactor_t *pn_object_reactor(void *object) { - return pn_class_reactor(pn_object_reify(object), object); + return pn_class_reactor(pn_class(object), object); } pn_reactor_t *pn_event_reactor(pn_event_t *event) { --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
