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 2b0f193f7305b08d4a1af872d0dcef5953d31370 Author: Andrew Stitcher <[email protected]> AuthorDate: Wed Apr 27 00:57:47 2022 -0400 PROTON-2542: Eliminate PN_CLASSDEF mechanism in favour of PN_CLASS This just makes fewer ways of making new classes and removes a spurious difference in the code. --- c/include/proton/object.h | 57 ---------------------------------------------- c/src/core/event.c | 28 +++++++++++++---------- c/src/core/object/object.c | 2 +- c/src/reactor/reactor.c | 11 +++++---- c/src/reactor/selectable.c | 11 +++++---- c/src/reactor/timer.c | 27 +++++++++++++--------- 6 files changed, 45 insertions(+), 91 deletions(-) diff --git a/c/include/proton/object.h b/c/include/proton/object.h index 24d26157..fe790631 100644 --- a/c/include/proton/object.h +++ b/c/include/proton/object.h @@ -73,63 +73,6 @@ PN_EXTERN extern const pn_class_t PN_WEAKREF[]; #define PN_CLASSCLASS(PREFIX) PREFIX ## __class -#define PN_CLASSDEF(PREFIX) \ -static void PREFIX ## _initialize_cast(void *object) { \ - PREFIX ## _initialize((PREFIX ## _t *) object); \ -} \ - \ -static void PREFIX ## _finalize_cast(void *object) { \ - PREFIX ## _finalize((PREFIX ## _t *) object); \ -} \ - \ -static uintptr_t PREFIX ## _hashcode_cast(void *object) { \ - uintptr_t (*fp)(PREFIX ## _t *) = PREFIX ## _hashcode; \ - if (fp) { \ - return fp((PREFIX ## _t *) object); \ - } else { \ - return (uintptr_t) object; \ - } \ -} \ - \ -static intptr_t PREFIX ## _compare_cast(void *a, void *b) { \ - intptr_t (*fp)(PREFIX ## _t *, PREFIX ## _t *) = PREFIX ## _compare; \ - if (fp) { \ - return fp((PREFIX ## _t *) a, (PREFIX ## _t *) b); \ - } else { \ - return (intptr_t) a - (intptr_t) b; \ - } \ -} \ - \ -static int PREFIX ## _inspect_cast(void *object, pn_string_t *str) { \ - int (*fp)(PREFIX ## _t *, pn_string_t *) = PREFIX ## _inspect; \ - if (fp) { \ - return fp((PREFIX ## _t *) object, str); \ - } else { \ - return pn_string_addf(str, "%s<%p>", #PREFIX, object); \ - } \ -} \ - \ -const pn_class_t PN_CLASSCLASS(PREFIX)[] = {{ \ - #PREFIX, \ - CID_ ## PREFIX, \ - pn_object_new, \ - PREFIX ## _initialize_cast, \ - pn_object_incref, \ - pn_object_decref, \ - pn_object_refcount, \ - PREFIX ## _finalize_cast, \ - pn_object_free, \ - pn_object_reify, \ - PREFIX ## _hashcode_cast, \ - PREFIX ## _compare_cast, \ - PREFIX ## _inspect_cast \ -}}; \ - \ -PREFIX ## _t *PREFIX ## _new(void) { \ - return (PREFIX ## _t *) pn_class_new(PN_CLASSCLASS(PREFIX), \ - sizeof(PREFIX ## _t)); \ -} - #define PN_CLASS(PREFIX) { \ #PREFIX, \ CID_ ## PREFIX, \ diff --git a/c/src/core/event.c b/c/src/core/event.c index 58bf6c01..3562a00e 100644 --- a/c/src/core/event.c +++ b/c/src/core/event.c @@ -41,8 +41,9 @@ struct pn_event_t { pn_event_type_t type; }; -static void pn_collector_initialize(pn_collector_t *collector) +static void pn_collector_initialize(void* object) { + pn_collector_t *collector = (pn_collector_t *)object; collector->pool = pn_list(PN_OBJECT, 0); collector->head = NULL; collector->tail = NULL; @@ -65,14 +66,16 @@ static void pn_collector_shrink(pn_collector_t *collector) pn_list_clear(collector->pool); } -static void pn_collector_finalize(pn_collector_t *collector) +static void pn_collector_finalize(void *object) { + pn_collector_t *collector = (pn_collector_t *)object; pn_collector_drain(collector); pn_decref(collector->pool); } -static int pn_collector_inspect(pn_collector_t *collector, pn_string_t *dst) +static int pn_collector_inspect(void *object, pn_string_t *dst) { + pn_collector_t *collector = (pn_collector_t *)object; assert(collector); int err = pn_string_addf(dst, "EVENTS["); if (err) return err; @@ -95,11 +98,10 @@ static int pn_collector_inspect(pn_collector_t *collector, pn_string_t *dst) #define pn_collector_hashcode NULL #define pn_collector_compare NULL -PN_CLASSDEF(pn_collector) - pn_collector_t *pn_collector(void) { - return pn_collector_new(); + static const pn_class_t clazz = PN_CLASS(pn_collector); + return (pn_collector_t *) pn_class_new(&clazz, sizeof(pn_collector_t)); } void pn_collector_free(pn_collector_t *collector) @@ -210,8 +212,9 @@ bool pn_collector_more(pn_collector_t *collector) return collector->head && collector->head->next; } -static void pn_event_initialize(pn_event_t *event) +static void pn_event_initialize(void *object) { + pn_event_t *event = (pn_event_t *)object; event->pool = NULL; event->type = PN_EVENT_NONE; event->clazz = NULL; @@ -220,7 +223,8 @@ static void pn_event_initialize(pn_event_t *event) event->attachments = pn_record(); } -static void pn_event_finalize(pn_event_t *event) { +static void pn_event_finalize(void *object) { + pn_event_t *event = (pn_event_t *)object; // decref before adding to the free list if (event->clazz && event->context) { pn_class_decref(event->clazz, event->context); @@ -243,8 +247,9 @@ static void pn_event_finalize(pn_event_t *event) { pn_decref(pool); } -static int pn_event_inspect(pn_event_t *event, pn_string_t *dst) +static int pn_event_inspect(void *object, pn_string_t *dst) { + pn_event_t *event = (pn_event_t *)object; assert(event); assert(dst); const char *name = pn_event_type_name(event->type); @@ -268,11 +273,10 @@ static int pn_event_inspect(pn_event_t *event, pn_string_t *dst) #define pn_event_hashcode NULL #define pn_event_compare NULL -PN_CLASSDEF(pn_event) - pn_event_t *pn_event(void) { - return pn_event_new(); + static const pn_class_t clazz = PN_CLASS(pn_event); + return pn_class_new(&clazz, sizeof(pn_event_t)); } pn_event_type_t pn_event_type(pn_event_t *event) diff --git a/c/src/core/object/object.c b/c/src/core/object/object.c index 794a0324..7164627d 100644 --- a/c/src/core/object/object.c +++ b/c/src/core/object/object.c @@ -62,7 +62,7 @@ void *pn_class_new(const pn_class_t *clazz, size_t size) { assert(clazz); void *object = clazz->newinst(clazz, size); - if (clazz->initialize) { + if (object && clazz->initialize) { clazz->initialize(object); } return object; diff --git a/c/src/reactor/reactor.c b/c/src/reactor/reactor.c index bbf94f1a..213b9f4e 100644 --- a/c/src/reactor/reactor.c +++ b/c/src/reactor/reactor.c @@ -66,7 +66,8 @@ pn_timestamp_t pn_reactor_now(pn_reactor_t *reactor) { return reactor->now; } -static void pn_reactor_initialize(pn_reactor_t *reactor) { +static void pn_reactor_initialize(void *object) { + pn_reactor_t *reactor = (pn_reactor_t *)object; reactor->attachments = pn_record(); reactor->io = pn_io(); reactor->collector = pn_collector(); @@ -85,7 +86,8 @@ static void pn_reactor_initialize(pn_reactor_t *reactor) { pn_reactor_mark(reactor); } -static void pn_reactor_finalize(pn_reactor_t *reactor) { +static void pn_reactor_finalize(void *object) { + pn_reactor_t *reactor = (pn_reactor_t *)object; for (int i = 0; i < 2; i++) { if (reactor->wakeup[i] != PN_INVALID_SOCKET) { pn_close(reactor->io, reactor->wakeup[i]); @@ -104,10 +106,9 @@ static void pn_reactor_finalize(pn_reactor_t *reactor) { #define pn_reactor_compare NULL #define pn_reactor_inspect NULL -PN_CLASSDEF(pn_reactor) - pn_reactor_t *pn_reactor() { - pn_reactor_t *reactor = pn_reactor_new(); + static const pn_class_t clazz = PN_CLASS(pn_reactor); + pn_reactor_t *reactor = pn_class_new(&clazz, sizeof(pn_reactor_t)); int err = pn_pipe(reactor->io, reactor->wakeup); if (err) { pn_free(reactor); diff --git a/c/src/reactor/selectable.c b/c/src/reactor/selectable.c index dffd1db6..9ee5e9ef 100644 --- a/c/src/reactor/selectable.c +++ b/c/src/reactor/selectable.c @@ -66,8 +66,9 @@ struct pn_selectable_t { bool terminal; }; -void pn_selectable_initialize(pn_selectable_t *sel) +void pn_selectable_initialize(void *object) { + pn_selectable_t *sel = (pn_selectable_t *)object; sel->fd = PN_INVALID_SOCKET; sel->index = -1; sel->attachments = pn_record(); @@ -85,8 +86,9 @@ void pn_selectable_initialize(pn_selectable_t *sel) sel->terminal = false; } -void pn_selectable_finalize(pn_selectable_t *sel) +void pn_selectable_finalize(void *object) { + pn_selectable_t *sel = (pn_selectable_t *)object; if (sel->finalize) { sel->finalize(sel); } @@ -98,11 +100,10 @@ void pn_selectable_finalize(pn_selectable_t *sel) #define pn_selectable_inspect NULL #define pn_selectable_compare NULL -PN_CLASSDEF(pn_selectable) - pn_selectable_t *pn_selectable(void) { - return pn_selectable_new(); + static const pn_class_t clazz = PN_CLASS(pn_selectable); + return pn_class_new(&clazz, sizeof(pn_selectable_t)); } bool pn_selectable_is_reading(pn_selectable_t *sel) { diff --git a/c/src/reactor/timer.c b/c/src/reactor/timer.c index bfd768eb..1e187223 100644 --- a/c/src/reactor/timer.c +++ b/c/src/reactor/timer.c @@ -30,16 +30,18 @@ struct pn_task_t { bool cancelled; }; -void pn_task_initialize(pn_task_t *task) { +void pn_task_initialize(void *object) { + pn_task_t *task = (pn_task_t *)object; task->pool = NULL; task->attachments = pn_record(); task->deadline = 0; task->cancelled = false; } -void pn_task_finalize(pn_task_t *task) { +void pn_task_finalize(void *object) { // if we are the last reference to the pool then don't put ourselves // into it + pn_task_t *task = (pn_task_t *)object; if (task->pool && pn_refcount(task->pool) > 1) { pn_record_clear(task->attachments); pn_list_add(task->pool, task); @@ -51,17 +53,18 @@ void pn_task_finalize(pn_task_t *task) { } } -intptr_t pn_task_compare(pn_task_t *a, pn_task_t *b) { - return a->deadline - b->deadline; +intptr_t pn_task_compare(void *a, void *b) { + pn_task_t *ta = (pn_task_t *)a; + pn_task_t *tb = (pn_task_t *)b; + return ta->deadline - tb->deadline; } #define pn_task_inspect NULL #define pn_task_hashcode NULL -PN_CLASSDEF(pn_task) - pn_task_t *pn_task(void) { - pn_task_t *task = pn_task_new(); + static const pn_class_t clazz = PN_CLASS(pn_task); + pn_task_t *task = pn_class_new(&clazz, sizeof(pn_task_t)); return task; } @@ -85,12 +88,14 @@ struct pn_timer_t { pn_collector_t *collector; }; -static void pn_timer_initialize(pn_timer_t *timer) { +static void pn_timer_initialize(void *object) { + pn_timer_t *timer = (pn_timer_t *)object; timer->pool = pn_list(PN_OBJECT, 0); timer->tasks = pn_list(PN_OBJECT, 0); } -static void pn_timer_finalize(pn_timer_t *timer) { +static void pn_timer_finalize(void *object) { + pn_timer_t *timer = (pn_timer_t *)object; pn_decref(timer->pool); pn_free(timer->tasks); } @@ -99,10 +104,10 @@ static void pn_timer_finalize(pn_timer_t *timer) { #define pn_timer_compare NULL #define pn_timer_hashcode NULL -PN_CLASSDEF(pn_timer) pn_timer_t *pn_timer(pn_collector_t *collector) { - pn_timer_t *timer = pn_timer_new(); + static const pn_class_t clazz = PN_CLASS(pn_timer); + pn_timer_t *timer = pn_class_new(&clazz, sizeof(pn_timer_t)); timer->collector = collector; return timer; } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
