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 2019/11/28 02:36:10 UTC

[qpid-proton] 02/02: PROTON-2150: Small reorganisation of object system to allow finer grained memory tracking

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

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

commit 05c2d997521b95258592fd9ceb8469403dfa6f14
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Wed Nov 27 19:06:08 2019 -0500

    PROTON-2150: Small reorganisation of object system to allow finer grained memory tracking
---
 c/include/proton/object.h | 52 +++++++++++++++++++++++------------------------
 c/src/proactor/epoll.c    | 16 +++++++--------
 c/src/proactor/libuv.c    | 20 +++++++++---------
 c/src/proactor/win_iocp.c | 18 ++++++++--------
 4 files changed, 52 insertions(+), 54 deletions(-)

diff --git a/c/include/proton/object.h b/c/include/proton/object.h
index 2761091..24d2615 100644
--- a/c/include/proton/object.h
+++ b/c/include/proton/object.h
@@ -71,6 +71,8 @@ PN_EXTERN extern const pn_class_t PN_OBJECT[];
 PN_EXTERN extern const pn_class_t PN_VOID[];
 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);                         \
@@ -107,8 +109,7 @@ static int PREFIX ## _inspect_cast(void *object, pn_string_t *str) {      \
   }                                                                       \
 }                                                                         \
                                                                           \
-const pn_class_t *PREFIX ## __class(void) {                               \
-  static const pn_class_t clazz = {                                       \
+const pn_class_t PN_CLASSCLASS(PREFIX)[] = {{                             \
     #PREFIX,                                                              \
     CID_ ## PREFIX,                                                       \
     pn_object_new,                                                        \
@@ -122,12 +123,10 @@ const pn_class_t *PREFIX ## __class(void) {                               \
     PREFIX ## _hashcode_cast,                                             \
     PREFIX ## _compare_cast,                                              \
     PREFIX ## _inspect_cast                                               \
-  };                                                                      \
-  return &clazz;                                                          \
-}                                                                         \
+}};                                                                       \
                                                                           \
 PREFIX ## _t *PREFIX ## _new(void) {                                      \
-  return (PREFIX ## _t *) pn_class_new(PREFIX ## __class(),               \
+  return (PREFIX ## _t *) pn_class_new(PN_CLASSCLASS(PREFIX),             \
                                        sizeof(PREFIX ## _t));             \
 }
 
@@ -164,27 +163,26 @@ PREFIX ## _t *PREFIX ## _new(void) {                                      \
 }
 
 /* Class to identify a plain C struct in a pn_event_t. No refcounting or memory management. */
-#define PN_STRUCT_CLASSDEF(PREFIX, CID)                                 \
-  const pn_class_t *PREFIX ## __class(void);                            \
-  static const pn_class_t *PREFIX ## _reify(void *p) { return PREFIX ## __class(); } \
-  const pn_class_t *PREFIX  ##  __class(void) {                         \
-  static const pn_class_t clazz = {                                     \
-    #PREFIX,                                                            \
-    CID,                                                                \
-    NULL, /*_new*/                                                      \
-    NULL, /*_initialize*/                                               \
-    pn_void_incref,                                                     \
-    pn_void_decref,                                                     \
-    pn_void_refcount,                                                   \
-    NULL, /* _finalize */                                               \
-    NULL, /* _free */                                                   \
-    PREFIX ## _reify,                                                   \
-    pn_void_hashcode,                                                   \
-    pn_void_compare,                                                    \
-    pn_void_inspect                                                     \
-    };                                                                  \
-  return &clazz;                                                        \
-  }
+#define PN_STRUCT_CLASSDEF(PREFIX)                  \
+static const pn_class_t *PREFIX ## _reify(void *p); \
+const pn_class_t PN_CLASSCLASS(PREFIX)[] = {{       \
+  #PREFIX,                                          \
+  CID_ ## PREFIX,                                   \
+  NULL, /*_new*/                                    \
+  NULL, /*_initialize*/                             \
+  pn_void_incref,                                   \
+  pn_void_decref,                                   \
+  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);
diff --git a/c/src/proactor/epoll.c b/c/src/proactor/epoll.c
index a360ff0..e68e7c8 100644
--- a/c/src/proactor/epoll.c
+++ b/c/src/proactor/epoll.c
@@ -278,8 +278,8 @@ const char *AMQP_PORT_NAME = "amqp";
 /* pn_proactor_t and pn_listener_t are plain C structs with normal memory management.
    Class definitions are for identification as pn_event_t context only.
 */
-PN_STRUCT_CLASSDEF(pn_proactor, CID_pn_proactor)
-PN_STRUCT_CLASSDEF(pn_listener, CID_pn_listener)
+PN_STRUCT_CLASSDEF(pn_proactor)
+PN_STRUCT_CLASSDEF(pn_listener)
 
 static bool start_polling(epoll_extended_t *ee, int epollfd) {
   if (ee->polling)
@@ -1460,7 +1460,7 @@ void pn_proactor_release_connection(pn_connection_t *c) {
 // ========================================================================
 
 pn_listener_t *pn_event_listener(pn_event_t *e) {
-  return (pn_event_class(e) == pn_listener__class()) ? (pn_listener_t*)pn_event_context(e) : NULL;
+  return (pn_event_class(e) == PN_CLASSCLASS(pn_listener)) ? (pn_listener_t*)pn_event_context(e) : NULL;
 }
 
 pn_listener_t *pn_listener() {
@@ -1563,7 +1563,7 @@ void pn_proactor_listen(pn_proactor_t *p, pn_listener_t *l, const char *addr, in
       psocket_error(&l->acceptors[0].psocket, errno, "listen on");
     }
   } else {
-    pn_collector_put(l->collector, pn_listener__class(), l, PN_LISTENER_OPEN);
+    pn_collector_put(l->collector, PN_CLASSCLASS(pn_listener), l, PN_LISTENER_OPEN);
   }
   proactor_add(&l->context);
   unlock(&l->context.mutex);
@@ -1639,7 +1639,7 @@ static void listener_begin_close(pn_listener_t* l) {
     /* Remove all acceptors from the overflow list.  closing flag prevents re-insertion.*/
     proactor_rearm_overflow(pn_listener_proactor(l));
     lock(&l->context.mutex);
-    pn_collector_put(l->collector, pn_listener__class(), l, PN_LISTENER_CLOSE);
+    pn_collector_put(l->collector, PN_CLASSCLASS(pn_listener), l, PN_LISTENER_CLOSE);
   }
 }
 
@@ -1738,7 +1738,7 @@ static pn_event_t *listener_batch_next(pn_event_batch_t *batch) {
   pn_event_t *e = pn_collector_next(l->collector);
   if (!e && l->pending_count && !l->unclaimed) {
     // empty collector means pn_collector_put() will not coalesce
-    pn_collector_put(l->collector, pn_listener__class(), l, PN_LISTENER_ACCEPT);
+    pn_collector_put(l->collector, PN_CLASSCLASS(pn_listener), l, PN_LISTENER_ACCEPT);
     l->unclaimed = true;
     l->pending_count--;
     e = pn_collector_next(l->collector);
@@ -1928,7 +1928,7 @@ void pn_proactor_free(pn_proactor_t *p) {
 }
 
 pn_proactor_t *pn_event_proactor(pn_event_t *e) {
-  if (pn_event_class(e) == pn_proactor__class()) return (pn_proactor_t*)pn_event_context(e);
+  if (pn_event_class(e) == PN_CLASSCLASS(pn_proactor)) return (pn_proactor_t*)pn_event_context(e);
   pn_listener_t *l = pn_event_listener(e);
   if (l) return l->acceptors[0].psocket.proactor;
   pn_connection_t *c = pn_event_connection(e);
@@ -1937,7 +1937,7 @@ pn_proactor_t *pn_event_proactor(pn_event_t *e) {
 }
 
 static void proactor_add_event(pn_proactor_t *p, pn_event_type_t t) {
-  pn_collector_put(p->collector, pn_proactor__class(), p, t);
+  pn_collector_put(p->collector, PN_CLASSCLASS(pn_proactor), p, t);
 }
 
 // Call with lock held.  Leave unchanged if events pending.
diff --git a/c/src/proactor/libuv.c b/c/src/proactor/libuv.c
index 2fabd43..2eb6e1c 100644
--- a/c/src/proactor/libuv.c
+++ b/c/src/proactor/libuv.c
@@ -75,8 +75,8 @@ const char *AMQP_PORT_NAME = "amqp";
 /* pn_proactor_t and pn_listener_t are plain C structs with normal memory management.
    CLASSDEF is for identification when used as a pn_event_t context.
 */
-PN_STRUCT_CLASSDEF(pn_proactor, CID_pn_proactor)
-PN_STRUCT_CLASSDEF(pn_listener, CID_pn_listener)
+PN_STRUCT_CLASSDEF(pn_proactor)
+PN_STRUCT_CLASSDEF(pn_listener)
 
 
 /* ================ Queues ================ */
@@ -149,7 +149,7 @@ typedef struct lsocket_t {
   struct lsocket_t *next;
 } lsocket_t;
 
-PN_STRUCT_CLASSDEF(lsocket, CID_pn_listener_socket)
+PN_STRUCT_CLASSDEF(pn_listener_socket)
 
 typedef enum { W_NONE, W_PENDING, W_CLOSED } wake_state;
 
@@ -558,7 +558,7 @@ static void on_connection(uv_stream_t* server, int err) {
     listener_error(l, err, "on incoming connection");
   } else {
     uv_mutex_lock(&l->lock);
-    pn_collector_put(l->collector, lsocket__class(), ls, PN_LISTENER_ACCEPT);
+    pn_collector_put(l->collector, PN_CLASSCLASS(pn_listener_socket), ls, PN_LISTENER_ACCEPT);
     uv_mutex_unlock(&l->lock);
   }
   work_notify(&l->work);
@@ -674,7 +674,7 @@ static void leader_listen_lh(pn_listener_t *l) {
   if (err) {
     listener_error_lh(l, err, "listening on");
   } else {
-    pn_collector_put(l->collector, pn_listener__class(), l, PN_LISTENER_OPEN);
+    pn_collector_put(l->collector, PN_CLASSCLASS(pn_listener), l, PN_LISTENER_OPEN);
   }
 }
 
@@ -737,7 +737,7 @@ static bool leader_process_listener(pn_listener_t *l) {
    case L_CLOSING:              /* Closing - can we send PN_LISTENER_CLOSE? */
     if (!l->lsockets) {
       l->state = L_CLOSED;
-      pn_collector_put(l->collector, pn_listener__class(), l, PN_LISTENER_CLOSE);
+      pn_collector_put(l->collector, PN_CLASSCLASS(pn_listener), l, PN_LISTENER_CLOSE);
     }
     break;
 
@@ -814,7 +814,7 @@ static void alloc_read_buffer(uv_handle_t* stream, size_t size, uv_buf_t* buf) {
 
 /* Set the event in the proactor's batch  */
 static pn_event_batch_t *proactor_batch_lh(pn_proactor_t *p, pn_event_type_t t) {
-  pn_collector_put(p->collector, pn_proactor__class(), p, t);
+  pn_collector_put(p->collector, PN_CLASSCLASS(pn_proactor), p, t);
   p->batch_working = true;
   return &p->batch;
 }
@@ -1087,9 +1087,9 @@ void pn_proactor_done(pn_proactor_t *p, pn_event_batch_t *batch) {
 }
 
 pn_listener_t *pn_event_listener(pn_event_t *e) {
-  if (pn_event_class(e) == pn_listener__class()) {
+  if (pn_event_class(e) == PN_CLASSCLASS(pn_listener)) {
     return (pn_listener_t*)pn_event_context(e);
-  } else if (pn_event_class(e) == lsocket__class()) {
+  } else if (pn_event_class(e) == PN_CLASSCLASS(pn_listener_socket)) {
     return ((lsocket_t*)pn_event_context(e))->parent;
   } else {
     return NULL;
@@ -1097,7 +1097,7 @@ pn_listener_t *pn_event_listener(pn_event_t *e) {
 }
 
 pn_proactor_t *pn_event_proactor(pn_event_t *e) {
-  if (pn_event_class(e) == pn_proactor__class()) {
+  if (pn_event_class(e) == PN_CLASSCLASS(pn_proactor)) {
     return (pn_proactor_t*)pn_event_context(e);
   }
   pn_listener_t *l = pn_event_listener(e);
diff --git a/c/src/proactor/win_iocp.c b/c/src/proactor/win_iocp.c
index 0f0a54b..07a3a78 100644
--- a/c/src/proactor/win_iocp.c
+++ b/c/src/proactor/win_iocp.c
@@ -1603,8 +1603,8 @@ PN_HANDLE(PN_PROACTOR)
 /* pn_proactor_t and pn_listener_t are plain C structs with normal memory management.
    Class definitions are for identification as pn_event_t context only.
 */
-PN_STRUCT_CLASSDEF(pn_proactor, CID_pn_proactor)
-PN_STRUCT_CLASSDEF(pn_listener, CID_pn_listener)
+PN_STRUCT_CLASSDEF(pn_proactor)
+PN_STRUCT_CLASSDEF(pn_listener)
 
 /* Completion serialization context common to connection and listener. */
 /* And also the reaper singleton (which has no socket */
@@ -2151,11 +2151,11 @@ static pconnection_t *get_pconnection(pn_connection_t* c) {
 
 
 pn_listener_t *pn_event_listener(pn_event_t *e) {
-  return (pn_event_class(e) == pn_listener__class()) ? (pn_listener_t*)pn_event_context(e) : NULL;
+  return (pn_event_class(e) == PN_CLASSCLASS(pn_listener)) ? (pn_listener_t*)pn_event_context(e) : NULL;
 }
 
 pn_proactor_t *pn_event_proactor(pn_event_t *e) {
-  if (pn_event_class(e) == pn_proactor__class()) return (pn_proactor_t*)pn_event_context(e);
+  if (pn_event_class(e) == PN_CLASSCLASS(pn_proactor)) return (pn_proactor_t*)pn_event_context(e);
   pn_listener_t *l = pn_event_listener(e);
   if (l) return l->context.proactor;
   pn_connection_t *c = pn_event_connection(e);
@@ -2470,7 +2470,7 @@ void pn_proactor_done(pn_proactor_t *p, pn_event_batch_t *batch) {
 }
 
 static void proactor_add_event(pn_proactor_t *p, pn_event_type_t t) {
-  pn_collector_put(p->collector, pn_proactor__class(), p, t);
+  pn_collector_put(p->collector, PN_CLASSCLASS(pn_proactor), p, t);
 }
 
 static pn_event_batch_t *proactor_process(pn_proactor_t *p) {
@@ -2826,7 +2826,7 @@ void pn_proactor_listen(pn_proactor_t *p, pn_listener_t *l, const char *addr, in
       psocket_error(l->psockets, wsa_err, "listen on");
     }
   } else {
-    pn_collector_put(l->collector, pn_listener__class(), l, PN_LISTENER_OPEN);
+    pn_collector_put(l->collector, PN_CLASSCLASS(pn_listener), l, PN_LISTENER_OPEN);
   }
   wakeup(l->psockets);
 }
@@ -2841,7 +2841,7 @@ static pn_event_batch_t *batch_owned(pn_listener_t *l) {
     }
     assert(!(l->context.closing && l->pending_events));
     if (l->pending_events) {
-      pn_collector_put(l->collector, pn_listener__class(), l, PN_LISTENER_ACCEPT);
+      pn_collector_put(l->collector, PN_CLASSCLASS(pn_listener), l, PN_LISTENER_ACCEPT);
       l->pending_events--;
       l->context.working = true;
       return &l->batch;
@@ -3035,7 +3035,7 @@ static pn_event_t *listener_batch_next(pn_event_batch_t *batch) {
   {
     csguard g(&l->context.cslock);
     if (!listener_has_event(l) && l->pending_events) {
-      pn_collector_put(l->collector, pn_listener__class(), l, PN_LISTENER_ACCEPT);
+      pn_collector_put(l->collector, PN_CLASSCLASS(pn_listener), l, PN_LISTENER_ACCEPT);
       l->pending_events--;
     }
     pn_event_t *e = pn_collector_next(l->collector);
@@ -3100,7 +3100,7 @@ static void listener_begin_close(pn_listener_t* l) {
   l->context.closing = true;
   listener_close_all(l);
   release_pending_accepts(l);
-  pn_collector_put(l->collector, pn_listener__class(), l, PN_LISTENER_CLOSE);
+  pn_collector_put(l->collector, PN_CLASSCLASS(pn_listener), l, PN_LISTENER_CLOSE);
 }
 
 void pn_listener_close(pn_listener_t* l) {


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