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]

Reply via email to