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