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 2022/05/13 14:24:04 UTC
[qpid-proton] branch main updated (dfebbe8c -> 00578917)
This is an automated email from the ASF dual-hosted git repository.
astitcher pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-proton.git
from dfebbe8c PROTON-1870: openssl layer: flush TLS error alert to peer for better error reporting
new 2b0f193f PROTON-2542: Eliminate PN_CLASSDEF mechanism in favour of PN_CLASS
new 24976938 PROTON-2542: Eliminate all code that uses pn_collector_put with PN_OBJECT
new 08668d80 PROTON-2542: Remove reify operation
new cd417188 PROTON-2542: Flatten out all direct pn_ object operations
new 0a770196 PROTON-2542: Make the object system a bit clearer
new 3755d074 PROTON-2542: Simplify pn_class_t handling
new e09c3e29 PROTON-2542: Eliminate uses of PN_OBJECT in uses of pn_list, pn_map & pn_hash
new 40b302f9 PROTON-2542: Make PN_OBJECT generic object management
new 00578917 PROTON-2542: Remove last vestiges of now unnecessary "reify" operation
The 9 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.gitignore | 2 +
c/include/proton/event.h | 23 ++-
c/include/proton/object.h | 123 ++----------
c/src/core/engine.c | 67 +++---
c/src/core/event.c | 48 +++--
c/src/core/object/map.c | 16 +-
c/src/core/object/object.c | 391 +++++++++++++++++++++++-------------
c/src/core/transport.c | 45 ++---
c/src/handlers/iohandler.c | 2 +-
c/src/messenger/messenger.c | 4 +-
c/src/messenger/store.c | 18 +-
c/src/messenger/subscription.c | 9 +-
c/src/messenger/subscription.h | 2 +
c/src/messenger/transform.c | 6 +-
c/src/proactor/epoll.c | 2 +-
c/src/proactor/epoll_timer.c | 3 -
c/src/proactor/libuv.c | 2 +-
c/src/proactor/win_iocp.cpp | 10 +-
c/src/reactor/acceptor.c | 4 +-
c/src/reactor/connection.c | 4 +-
c/src/reactor/handler.c | 7 +-
c/src/reactor/io/windows/iocp.c | 11 +-
c/src/reactor/io/windows/iocp.h | 2 +
c/src/reactor/io/windows/selector.c | 2 +-
c/src/reactor/reactor.c | 27 +--
c/src/reactor/selectable.c | 19 +-
c/src/reactor/selectable.h | 2 +
c/src/reactor/timer.c | 33 +--
c/src/sasl/sasl.c | 2 +-
c/tests/event_test.cpp | 12 +-
c/tests/object_test.cpp | 119 ++++++-----
c/tools/reactor-recv.c | 8 +-
cpp/src/contexts.cpp | 2 +-
cpp/src/receiver.cpp | 2 +-
python/cproton.i | 10 +-
python/setup.py | 2 +-
36 files changed, 574 insertions(+), 467 deletions(-)
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[qpid-proton] 06/09: PROTON-2542: Simplify pn_class_t handling
Posted by as...@apache.org.
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 3755d074619e026fefad0ecef1c8a10bfa7783fb
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Fri Apr 29 10:49:53 2022 -0400
PROTON-2542: Simplify pn_class_t handling
Allow every vtable entry to be NULL and have a good default behaviour.
This allows a lot of devirtualization as the majority of the entries are
now NULL and are handled without an indirect jump. It also reduces the
number of symbols needed to be exported to be in the pn_class_t tables.
---
c/include/proton/object.h | 40 +++++------
c/src/core/engine.c | 24 +++----
c/src/core/object/object.c | 164 ++++++++++++++++++++++++++++-----------------
c/src/core/transport.c | 8 +--
cpp/src/contexts.cpp | 2 +-
5 files changed, 137 insertions(+), 101 deletions(-)
diff --git a/c/include/proton/object.h b/c/include/proton/object.h
index fb8236db..d89dd927 100644
--- a/c/include/proton/object.h
+++ b/c/include/proton/object.h
@@ -70,18 +70,20 @@ 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[];
+PN_EXTERN void pn_object_incref(void *object);
+
#define PN_CLASSCLASS(PREFIX) PREFIX ## __class
#define PN_CLASS(PREFIX) { \
#PREFIX, \
CID_ ## PREFIX, \
- pn_object_new, \
+ NULL, \
PREFIX ## _initialize, \
- pn_object_incref, \
- pn_object_decref, \
- pn_object_refcount, \
+ NULL, \
+ NULL, \
+ NULL, \
PREFIX ## _finalize, \
- pn_object_free, \
+ NULL, \
PREFIX ## _hashcode, \
PREFIX ## _compare, \
PREFIX ## _inspect \
@@ -102,6 +104,11 @@ PN_EXTERN extern const pn_class_t PN_WEAKREF[];
PREFIX ## _inspect \
}
+PN_EXTERN void *pn_void_new(const pn_class_t *clazz, size_t size);
+PN_EXTERN void pn_void_incref(void *object);
+PN_EXTERN void pn_void_decref(void *object);
+PN_EXTERN int pn_void_refcount(void *object);
+
/* Class to identify a plain C struct in a pn_event_t. No refcounting or memory management. */
#define PN_STRUCT_CLASSDEF(PREFIX) \
const pn_class_t PN_CLASSCLASS(PREFIX)[] = {{ \
@@ -123,12 +130,6 @@ 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);
PN_EXTERN void *pn_class_new(const pn_class_t *clazz, size_t size);
-/* pn_incref, pn_decref and pn_refcount are for internal use by the proton
- library, the should not be called by application code. Application code
- should use the appropriate pn_*_free function (pn_link_free, pn_session_free
- etc.) when it is finished with a proton value. Proton values should only be
- used when handling a pn_event_t that refers to them.
-*/
PN_EXTERN void *pn_class_incref(const pn_class_t *clazz, void *object);
PN_EXTERN int pn_class_refcount(const pn_class_t *clazz, void *object);
PN_EXTERN int pn_class_decref(const pn_class_t *clazz, void *object);
@@ -139,17 +140,12 @@ 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);
-PN_EXTERN void *pn_void_new(const pn_class_t *clazz, size_t size);
-PN_EXTERN void pn_void_incref(void *object);
-PN_EXTERN void pn_void_decref(void *object);
-PN_EXTERN int pn_void_refcount(void *object);
-
-PN_EXTERN void *pn_object_new(const pn_class_t *clazz, size_t size);
-PN_EXTERN void pn_object_incref(void *object);
-PN_EXTERN int pn_object_refcount(void *object);
-PN_EXTERN void pn_object_decref(void *object);
-PN_EXTERN void pn_object_free(void *object);
-
+/* pn_incref, pn_decref and pn_refcount are for internal use by the proton
+ * library, the should not be called by application code. Application code
+ * should use the appropriate pn_*_free function (pn_link_free, pn_session_free
+ * etc.) when it is finished with a proton value. Proton values should only be
+ * used when handling a pn_event_t that refers to them.
+ */
PN_EXTERN void *pn_incref(void *object);
PN_EXTERN int pn_decref(void *object);
PN_EXTERN int pn_refcount(void *object);
diff --git a/c/src/core/engine.c b/c/src/core/engine.c
index 1f25aadd..b03d64eb 100644
--- a/c/src/core/engine.c
+++ b/c/src/core/engine.c
@@ -977,9 +977,9 @@ 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_new NULL
+#define pn_session_refcount NULL
+#define pn_session_decref NULL
#define pn_session_initialize NULL
#define pn_session_hashcode NULL
#define pn_session_compare NULL
@@ -988,7 +988,7 @@ static void pn_session_finalize(void *object)
pn_session_t *pn_session(pn_connection_t *conn)
{
assert(conn);
-#define pn_session_free pn_object_free
+#define pn_session_free NULL
static const pn_class_t clazz = PN_METACLASS(pn_session);
#undef pn_session_free
pn_session_t *ssn = (pn_session_t *) pn_class_new(&clazz, sizeof(pn_session_t));
@@ -1146,8 +1146,8 @@ static void pn_link_finalize(void *object)
pn_free(link->remote_properties);
}
-#define pn_link_refcount pn_object_refcount
-#define pn_link_decref pn_object_decref
+#define pn_link_refcount NULL
+#define pn_link_decref NULL
#define pn_link_initialize NULL
#define pn_link_hashcode NULL
#define pn_link_compare NULL
@@ -1155,8 +1155,8 @@ static void pn_link_finalize(void *object)
pn_link_t *pn_link_new(int type, pn_session_t *session, const char *name)
{
-#define pn_link_new pn_object_new
-#define pn_link_free pn_object_free
+#define pn_link_new NULL
+#define pn_link_free NULL
static const pn_class_t clazz = PN_METACLASS(pn_link);
#undef pn_link_new
#undef pn_link_free
@@ -1507,10 +1507,10 @@ static void pn_disposition_clear(pn_disposition_t *ds)
pn_condition_clear(&ds->condition);
}
-#define pn_delivery_new pn_object_new
-#define pn_delivery_refcount pn_object_refcount
-#define pn_delivery_decref pn_object_decref
-#define pn_delivery_free pn_object_free
+#define pn_delivery_new NULL
+#define pn_delivery_refcount NULL
+#define pn_delivery_decref NULL
+#define pn_delivery_free NULL
#define pn_delivery_initialize NULL
#define pn_delivery_hashcode NULL
#define pn_delivery_compare NULL
diff --git a/c/src/core/object/object.c b/c/src/core/object/object.c
index 040f4113..86707c48 100644
--- a/c/src/core/object/object.c
+++ b/c/src/core/object/object.c
@@ -67,10 +67,91 @@ pn_cid_t pn_class_id(const pn_class_t *clazz)
return clazz->cid;
}
+static inline void *pni_default_new(const pn_class_t *clazz, size_t size)
+{
+ void *object = NULL;
+ pni_head_t *head = (pni_head_t *) pni_mem_zallocate(clazz, sizeof(pni_head_t) + size);
+ if (head != NULL) {
+ object = head + 1;
+ head->clazz = clazz;
+ head->refcount = 1;
+ }
+ return object;
+}
+
+static inline void pni_default_incref(void *object) {
+ if (object) {
+ pni_head(object)->refcount++;
+ }
+}
+
+static inline int pni_default_refcount(void *object)
+{
+ assert(object);
+ return pni_head(object)->refcount;
+}
+
+static inline void pni_default_decref(void *object)
+{
+ pni_head_t *head = pni_head(object);
+ assert(head->refcount > 0);
+ head->refcount--;
+}
+
+static inline void pni_default_free(void *object)
+{
+ pni_head_t *head = pni_head(object);
+ pni_mem_deallocate(head->clazz, head);
+}
+
+void pn_object_incref(void *object) {
+ pni_default_incref(object);
+}
+
+static inline void *pni_class_new(const pn_class_t *clazz, size_t size) {
+ if (clazz->newinst) {
+ return clazz->newinst(clazz, size);
+ } else {
+ return pni_default_new(clazz, size);
+ }
+}
+
+static inline void pni_class_incref(const pn_class_t *clazz, void *object) {
+ if (clazz->incref) {
+ clazz->incref(object);
+ } else {
+ pni_default_incref(object);
+ }
+}
+
+static inline void pni_class_decref(const pn_class_t *clazz, void *object) {
+ if (clazz->decref) {
+ clazz->decref(object);
+ } else {
+ pni_default_decref(object);
+ }
+}
+
+static inline int pni_class_refcount(const pn_class_t *clazz, void *object) {
+ if (clazz->refcount) {
+ return clazz->refcount(object);
+ } else {
+ return pni_default_refcount(object);
+ }
+}
+
+static inline void pni_class_free(const pn_class_t *clazz, void *object) {
+ if (clazz->free) {
+ clazz->free(object);
+ } else {
+ pni_default_free(object);
+ }
+}
+
void *pn_class_new(const pn_class_t *clazz, size_t size)
{
assert(clazz);
- void *object = clazz->newinst(clazz, size);
+ void *object = pni_class_new(clazz, size);
if (object && clazz->initialize) {
clazz->initialize(object);
}
@@ -83,8 +164,7 @@ void *pn_class_incref(const pn_class_t *clazz, void *object)
if (clazz==PN_OBJECT) {
clazz = pni_head(object)->clazz;
}
-
- clazz->incref(object);
+ pni_class_incref(clazz, object);
}
return object;
}
@@ -95,7 +175,7 @@ int pn_class_refcount(const pn_class_t *clazz, void *object)
clazz = pn_class(object);
}
- return clazz->refcount(object);
+ return pni_class_refcount(clazz, object);
}
int pn_class_decref(const pn_class_t *clazz, void *object)
@@ -104,18 +184,17 @@ int pn_class_decref(const pn_class_t *clazz, void *object)
if (clazz==PN_OBJECT) {
clazz = pni_head(object)->clazz;
}
-
- clazz->decref(object);
- int rc = clazz->refcount(object);
+ pni_class_decref(clazz, object);
+ int rc = pni_class_refcount(clazz, object);
if (rc == 0) {
if (clazz->finalize) {
clazz->finalize(object);
// check the refcount again in case the finalizer created a
// new reference
- rc = clazz->refcount(object);
+ rc = pni_class_refcount(clazz, object);
}
if (rc == 0) {
- clazz->free(object);
+ pni_class_free(clazz, object);
return 0;
}
} else {
@@ -133,7 +212,7 @@ void pn_class_free(const pn_class_t *clazz, void *object)
clazz = pni_head(object)->clazz;
}
- int rc = clazz->refcount(object);
+ int rc = pni_class_refcount(clazz, object);
assert(rc == 1 || rc == -1);
if (rc == 1) {
rc = pn_class_decref(clazz, object);
@@ -142,7 +221,7 @@ void pn_class_free(const pn_class_t *clazz, void *object)
if (clazz->finalize) {
clazz->finalize(object);
}
- clazz->free(object);
+ pni_class_free(clazz, object);
}
}
}
@@ -186,50 +265,11 @@ int pn_class_inspect(const pn_class_t *clazz, void *object, pn_string_t *dst)
return pn_string_addf(dst, "%s<%p>", name, object);
}
-void *pn_object_new(const pn_class_t *clazz, size_t size)
-{
- void *object = NULL;
- pni_head_t *head = (pni_head_t *) pni_mem_zallocate(clazz, sizeof(pni_head_t) + size);
- if (head != NULL) {
- object = head + 1;
- head->clazz = clazz;
- head->refcount = 1;
- }
- return object;
-}
-
-
-void pn_object_incref(void *object)
-{
- if (object) {
- pni_head(object)->refcount++;
- }
-}
-
-int pn_object_refcount(void *object)
-{
- assert(object);
- return pni_head(object)->refcount;
-}
-
-void pn_object_decref(void *object)
-{
- pni_head_t *head = pni_head(object);
- assert(head->refcount > 0);
- head->refcount--;
-}
-
-void pn_object_free(void *object)
-{
- pni_head_t *head = pni_head(object);
- pni_mem_deallocate(head->clazz, head);
-}
-
void *pn_incref(void *object)
{
if (object) {
const pn_class_t *clazz = pni_head(object)->clazz;
- clazz->incref(object);
+ pni_class_incref(clazz, object);
}
return object;
}
@@ -238,17 +278,17 @@ int pn_decref(void *object)
{
if (object) {
const pn_class_t *clazz = pni_head(object)->clazz;
- clazz->decref(object);
- int rc = clazz->refcount(object);
+ pni_class_decref(clazz, object);
+ int rc = pni_class_refcount(clazz, object);
if (rc == 0) {
if (clazz->finalize) {
clazz->finalize(object);
// check the refcount again in case the finalizer created a
// new reference
- rc = clazz->refcount(object);
+ rc = pni_class_refcount(clazz, object);
}
if (rc == 0) {
- clazz->free(object);
+ pni_class_free(clazz, object);
return 0;
}
} else {
@@ -262,29 +302,29 @@ int pn_refcount(void *object)
{
assert(object);
const pn_class_t *clazz = pni_head(object)->clazz;
- return clazz->refcount(object);
+ return pni_class_refcount(clazz, object);
}
void pn_free(void *object)
{
if (object) {
const pn_class_t *clazz = pni_head(object)->clazz;
- int rc = clazz->refcount(object);
+ int rc = pni_class_refcount(clazz, object);
assert(rc == 1 || rc == -1);
if (rc == 1) {
- clazz->decref(object);
- assert(clazz->refcount(object) == 0);
+ pni_class_decref(clazz, object);
+ assert(pni_class_refcount(clazz, object) == 0);
if (clazz->finalize) {
clazz->finalize(object);
}
- if (clazz->refcount(object) == 0) {
- clazz->free(object);
+ if (pni_class_refcount(clazz, object) == 0) {
+ pni_class_free(clazz, object);
}
} else {
if (clazz->finalize) {
clazz->finalize(object);
}
- clazz->free(object);
+ pni_class_free(clazz, object);
}
}
}
diff --git a/c/src/core/transport.c b/c/src/core/transport.c
index 0e101982..1fad3773 100644
--- a/c/src/core/transport.c
+++ b/c/src/core/transport.c
@@ -535,16 +535,16 @@ static void pn_transport_incref(void *object)
}
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_new NULL
+#define pn_transport_refcount NULL
+#define pn_transport_decref NULL
#define pn_transport_hashcode NULL
#define pn_transport_compare NULL
#define pn_transport_inspect NULL
pn_transport_t *pn_transport(void)
{
-#define pn_transport_free pn_object_free
+#define pn_transport_free NULL
static const pn_class_t clazz = PN_METACLASS(pn_transport);
#undef pn_transport_free
pn_transport_t *transport =
diff --git a/cpp/src/contexts.cpp b/cpp/src/contexts.cpp
index f6b78228..7bc6c3f0 100644
--- a/cpp/src/contexts.cpp
+++ b/cpp/src/contexts.cpp
@@ -64,7 +64,7 @@ T* get_context(pn_record_t* record, pn_handle_t handle) {
context::~context() {}
-void *context::alloc(size_t n) { return pn_object_new(&cpp_context_class, n); }
+void *context::alloc(size_t n) { return pn_class_new(&cpp_context_class, n); }
pn_class_t* context::pn_class() { return &cpp_context_class; }
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[qpid-proton] 02/09: PROTON-2542: Eliminate all code that uses pn_collector_put with PN_OBJECT
Posted by as...@apache.org.
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 24976938f30bc82cb9dce8802e955035628f9b2e
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Mon May 2 18:20:04 2022 -0400
PROTON-2542: Eliminate all code that uses pn_collector_put with PN_OBJECT
This is to avoid the need to export the PN_OBJECT symbol from
libqpid_core - A step towards making most of object.h private and not
exported by the libqpid_core library.
---
c/include/proton/event.h | 23 ++++++++++++++++++++++-
c/src/core/engine.c | 24 ++++++++++++------------
c/src/core/event.c | 6 ++++++
c/src/core/transport.c | 36 ++++++++++++++++++------------------
c/src/proactor/epoll.c | 2 +-
c/src/proactor/libuv.c | 2 +-
c/src/proactor/win_iocp.cpp | 2 +-
c/src/reactor/reactor.c | 12 ++++++------
c/src/reactor/selectable.c | 8 ++++----
c/src/reactor/timer.c | 2 +-
c/src/sasl/sasl.c | 2 +-
c/tests/event_test.cpp | 6 +++---
cpp/src/receiver.cpp | 2 +-
13 files changed, 77 insertions(+), 50 deletions(-)
diff --git a/c/include/proton/event.h b/c/include/proton/event.h
index dba1b44f..048a60ee 100644
--- a/c/include/proton/event.h
+++ b/c/include/proton/event.h
@@ -526,7 +526,7 @@ PN_EXTERN void pn_collector_drain(pn_collector_t *collector);
* this happens, this operation will return a NULL pointer.
*
* @param[in] collector a collector object
- * @param[in] clazz class of the context
+ * @param[in] clazz memory management class of the context
* @param[in] context the event context
* @param[in] type the event type
*
@@ -538,6 +538,27 @@ PN_EXTERN pn_event_t *pn_collector_put(pn_collector_t *collector,
const pn_class_t *clazz, void *context,
pn_event_type_t type);
+/**
+ * Place a new event on a collector.
+ *
+ * This operation will create a new event of the given type with a
+ * context that is managed as a pn_object and return a pointer to the
+ * newly created event. In some cases an event of the given type and
+ * context can be elided. When this happens, this operation will return
+ * a NULL pointer.
+ *
+ * @param[in] collector a collector object
+ * @param[in] object the event context object
+ * @param[in] type the event type
+ *
+ * @return a pointer to the newly created event or NULL if the event
+ * was elided
+ */
+
+PN_EXTERN pn_event_t *pn_collector_put_object(pn_collector_t *collector,
+ void *object,
+ pn_event_type_t type);
+
/**
* Access the head event contained by a collector.
*
diff --git a/c/src/core/engine.c b/c/src/core/engine.c
index d16cf657..e5f64497 100644
--- a/c/src/core/engine.c
+++ b/c/src/core/engine.c
@@ -79,8 +79,8 @@ static void pn_endpoint_open(pn_endpoint_t *endpoint)
if (!(endpoint->state & PN_LOCAL_ACTIVE)) {
PN_SET_LOCAL(endpoint->state, PN_LOCAL_ACTIVE);
pn_connection_t *conn = pni_ep_get_connection(endpoint);
- pn_collector_put(conn->collector, PN_OBJECT, endpoint,
- endpoint_event((pn_endpoint_type_t) endpoint->type, true));
+ pn_collector_put_object(conn->collector, endpoint,
+ endpoint_event((pn_endpoint_type_t) endpoint->type, true));
pn_modified(conn, endpoint, true);
}
}
@@ -90,8 +90,8 @@ static void pn_endpoint_close(pn_endpoint_t *endpoint)
if (!(endpoint->state & PN_LOCAL_CLOSED)) {
PN_SET_LOCAL(endpoint->state, PN_LOCAL_CLOSED);
pn_connection_t *conn = pni_ep_get_connection(endpoint);
- pn_collector_put(conn->collector, PN_OBJECT, endpoint,
- endpoint_event((pn_endpoint_type_t) endpoint->type, false));
+ pn_collector_put_object(conn->collector, endpoint,
+ endpoint_event((pn_endpoint_type_t) endpoint->type, false));
pn_modified(conn, endpoint, true);
}
}
@@ -154,7 +154,7 @@ void pn_connection_free(pn_connection_t *connection) {
void pn_connection_bound(pn_connection_t *connection)
{
- pn_collector_put(connection->collector, PN_OBJECT, connection, PN_CONNECTION_BOUND);
+ pn_collector_put_object(connection->collector, connection, PN_CONNECTION_BOUND);
pn_ep_incref(&connection->endpoint);
size_t nsessions = pn_list_size(connection->sessions);
@@ -337,7 +337,7 @@ void pn_link_detach(pn_link_t *link)
if (link->detached) return;
link->detached = true;
- pn_collector_put(link->session->connection->collector, PN_OBJECT, link, PN_LINK_LOCAL_DETACH);
+ pn_collector_put_object(link->session->connection->collector, link, PN_LINK_LOCAL_DETACH);
pn_modified(link->session->connection, &link->endpoint, true);
}
@@ -449,7 +449,7 @@ void pn_ep_decref(pn_endpoint_t *endpoint)
endpoint->refcount--;
if (endpoint->refcount == 0) {
pn_connection_t *conn = pni_ep_get_connection(endpoint);
- pn_collector_put(conn->collector, PN_OBJECT, endpoint, pn_final_type((pn_endpoint_type_t) endpoint->type));
+ pn_collector_put_object(conn->collector, endpoint, pn_final_type((pn_endpoint_type_t) endpoint->type));
}
}
@@ -560,7 +560,7 @@ void pn_connection_collect(pn_connection_t *connection, pn_collector_t *collecto
pn_incref(connection->collector);
pn_endpoint_t *endpoint = connection->endpoint_head;
while (endpoint) {
- pn_collector_put(connection->collector, PN_OBJECT, endpoint, endpoint_init_event_map[endpoint->type]);
+ pn_collector_put_object(connection->collector, endpoint, endpoint_init_event_map[endpoint->type]);
endpoint = endpoint->endpoint_next;
}
}
@@ -781,8 +781,8 @@ void pn_modified(pn_connection_t *connection, pn_endpoint_t *endpoint, bool emit
}
if (emit && connection->transport) {
- pn_collector_put(connection->collector, PN_OBJECT, connection->transport,
- PN_TRANSPORT);
+ pn_collector_put_object(connection->collector, connection->transport,
+ PN_TRANSPORT);
}
}
@@ -1018,7 +1018,7 @@ pn_session_t *pn_session(pn_connection_t *conn)
ssn->state.remote_handles = pn_hash(PN_WEAKREF, 0, 0.75);
// end transport state
- pn_collector_put(conn->collector, PN_OBJECT, ssn, PN_SESSION_INIT);
+ pn_collector_put_object(conn->collector, ssn, PN_SESSION_INIT);
if (conn->transport) {
pni_session_bound(ssn);
}
@@ -1200,7 +1200,7 @@ pn_link_t *pn_link_new(int type, pn_session_t *session, const char *name)
link->state.link_credit = 0;
// end transport state
- pn_collector_put(session->connection->collector, PN_OBJECT, link, PN_LINK_INIT);
+ pn_collector_put_object(session->connection->collector, link, PN_LINK_INIT);
if (session->connection->transport) {
pni_link_bound(link);
}
diff --git a/c/src/core/event.c b/c/src/core/event.c
index 3562a00e..428fc10e 100644
--- a/c/src/core/event.c
+++ b/c/src/core/event.c
@@ -169,6 +169,12 @@ pn_event_t *pn_collector_put(pn_collector_t *collector,
return event;
}
+pn_event_t *pn_collector_put_object(pn_collector_t *collector, void *object, pn_event_type_t type)
+{
+ const pn_class_t *clazz = pn_class(object);
+ return pn_collector_put(collector, clazz, object, type);
+}
+
pn_event_t *pn_collector_peek(pn_collector_t *collector)
{
return collector->head;
diff --git a/c/src/core/transport.c b/c/src/core/transport.c
index b05f25ad..49d15d07 100644
--- a/c/src/core/transport.c
+++ b/c/src/core/transport.c
@@ -668,9 +668,9 @@ static void pn_transport_finalize(void *object)
}
static void pni_post_remote_open_events(pn_transport_t *transport, pn_connection_t *connection) {
- pn_collector_put(connection->collector, PN_OBJECT, connection, PN_CONNECTION_REMOTE_OPEN);
+ pn_collector_put_object(connection->collector, connection, PN_CONNECTION_REMOTE_OPEN);
if (transport->remote_idle_timeout) {
- pn_collector_put(connection->collector, PN_OBJECT, transport, PN_TRANSPORT);
+ pn_collector_put_object(connection->collector, transport, PN_TRANSPORT);
}
}
@@ -762,7 +762,7 @@ int pn_transport_unbind(pn_transport_t *transport)
transport->connection = NULL;
bool was_referenced = transport->referenced;
- pn_collector_put(conn->collector, PN_OBJECT, conn, PN_CONNECTION_UNBOUND);
+ pn_collector_put_object(conn->collector, conn, PN_CONNECTION_UNBOUND);
// XXX: what happens if the endpoints are freed before we get here?
pn_session_t *ssn = pn_session_head(conn, 0);
@@ -977,7 +977,7 @@ static void pni_maybe_post_closed(pn_transport_t *transport)
{
pn_collector_t *collector = pni_transport_collector(transport);
if (transport->head_closed && transport->tail_closed) {
- pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_CLOSED);
+ pn_collector_put_object(collector, transport, PN_TRANSPORT_CLOSED);
}
}
@@ -986,7 +986,7 @@ static void pni_close_tail(pn_transport_t *transport)
if (!transport->tail_closed) {
transport->tail_closed = true;
pn_collector_t *collector = pni_transport_collector(transport);
- pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_TAIL_CLOSED);
+ pn_collector_put_object(collector, transport, PN_TRANSPORT_TAIL_CLOSED);
pni_maybe_post_closed(transport);
}
}
@@ -1020,7 +1020,7 @@ int pn_do_error(pn_transport_t *transport, const char *condition, const char *fm
}
}
pn_collector_t *collector = pni_transport_collector(transport);
- pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_ERROR);
+ pn_collector_put_object(collector, transport, PN_TRANSPORT_ERROR);
// Special case being called with no condition and no fmt to log the existing error condition
if (fmt && condition) {
PN_LOG(&transport->logger, PN_SUBSYSTEM_AMQP, PN_LEVEL_ERROR, "%s %s", condition, buf);
@@ -1140,7 +1140,7 @@ int pn_do_begin(pn_transport_t *transport, uint8_t frame_type, uint16_t channel,
}
pni_map_remote_channel(ssn, channel);
PN_SET_REMOTE(ssn->endpoint.state, PN_REMOTE_ACTIVE);
- pn_collector_put(transport->connection->collector, PN_OBJECT, ssn, PN_SESSION_REMOTE_OPEN);
+ pn_collector_put_object(transport->connection->collector, ssn, PN_SESSION_REMOTE_OPEN);
return 0;
}
@@ -1360,7 +1360,7 @@ int pn_do_attach(pn_transport_t *transport, uint8_t frame_type, uint16_t channel
link->remote_max_message_size = max_msgsz;
}
- pn_collector_put(transport->connection->collector, PN_OBJECT, link, PN_LINK_REMOTE_OPEN);
+ pn_collector_put_object(transport->connection->collector, link, PN_LINK_REMOTE_OPEN);
return 0;
}
@@ -1493,7 +1493,7 @@ int pn_do_transfer(pn_transport_t *transport, uint8_t frame_type, uint16_t chann
link->more_pending = false;
pn_work_update(transport->connection, delivery);
}
- pn_collector_put(transport->connection->collector, PN_OBJECT, delivery, PN_DELIVERY);
+ pn_collector_put_object(transport->connection->collector, delivery, PN_DELIVERY);
}
ssn->incoming_bytes += payload.size;
@@ -1559,7 +1559,7 @@ int pn_do_flow(pn_transport_t *transport, uint8_t frame_type, uint16_t channel,
}
}
- pn_collector_put(transport->connection->collector, PN_OBJECT, link, PN_LINK_FLOW);
+ pn_collector_put_object(transport->connection->collector, link, PN_LINK_FLOW);
}
return 0;
@@ -1649,7 +1649,7 @@ static int pni_do_delivery_disposition(pn_transport_t * transport, pn_delivery_t
delivery->updated = true;
pn_work_update(transport->connection, delivery);
- pn_collector_put(transport->connection->collector, PN_OBJECT, delivery, PN_DELIVERY);
+ pn_collector_put_object(transport->connection->collector, delivery, PN_DELIVERY);
return 0;
}
@@ -1740,9 +1740,9 @@ int pn_do_detach(pn_transport_t *transport, uint8_t frame_type, uint16_t channel
if (closed)
{
PN_SET_REMOTE(link->endpoint.state, PN_REMOTE_CLOSED);
- pn_collector_put(transport->connection->collector, PN_OBJECT, link, PN_LINK_REMOTE_CLOSE);
+ pn_collector_put_object(transport->connection->collector, link, PN_LINK_REMOTE_CLOSE);
} else {
- pn_collector_put(transport->connection->collector, PN_OBJECT, link, PN_LINK_REMOTE_DETACH);
+ pn_collector_put_object(transport->connection->collector, link, PN_LINK_REMOTE_DETACH);
}
pni_unmap_remote_handle(link);
@@ -1764,7 +1764,7 @@ int pn_do_end(pn_transport_t *transport, uint8_t frame_type, uint16_t channel, p
pn_condition_set(condition, cond, desc);
pn_data_rewind(pn_condition_info(condition));
PN_SET_REMOTE(ssn->endpoint.state, PN_REMOTE_CLOSED);
- pn_collector_put(transport->connection->collector, PN_OBJECT, ssn, PN_SESSION_REMOTE_CLOSE);
+ pn_collector_put_object(transport->connection->collector, ssn, PN_SESSION_REMOTE_CLOSE);
pni_unmap_remote_channel(ssn);
return 0;
}
@@ -1782,7 +1782,7 @@ int pn_do_close(pn_transport_t *transport, uint8_t frame_type, uint16_t channel,
pn_data_rewind(pn_condition_info(condition));
transport->close_rcvd = true;
PN_SET_REMOTE(conn->endpoint.state, PN_REMOTE_CLOSED);
- pn_collector_put(transport->connection->collector, PN_OBJECT, conn, PN_CONNECTION_REMOTE_CLOSE);
+ pn_collector_put_object(transport->connection->collector, conn, PN_CONNECTION_REMOTE_CLOSE);
return 0;
}
@@ -2205,7 +2205,7 @@ static int pni_process_tpwork_sender(pn_transport_t *transport, pn_delivery_t *d
// Aborted delivery with no data yet sent, drop it and issue a FLOW as we may have credit.
*settle = true;
state->sent = true;
- pn_collector_put(transport->connection->collector, PN_OBJECT, link, PN_LINK_FLOW);
+ pn_collector_put_object(transport->connection->collector, link, PN_LINK_FLOW);
return 0;
}
*settle = false;
@@ -2255,7 +2255,7 @@ static int pni_process_tpwork_sender(pn_transport_t *transport, pn_delivery_t *d
link->session->outgoing_deliveries--;
}
- pn_collector_put(transport->connection->collector, PN_OBJECT, link, PN_LINK_FLOW);
+ pn_collector_put_object(transport->connection->collector, link, PN_LINK_FLOW);
}
}
@@ -2708,7 +2708,7 @@ static void pni_close_head(pn_transport_t *transport)
if (!transport->head_closed) {
transport->head_closed = true;
pn_collector_t *collector = pni_transport_collector(transport);
- pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT_HEAD_CLOSED);
+ pn_collector_put_object(collector, transport, PN_TRANSPORT_HEAD_CLOSED);
pni_maybe_post_closed(transport);
}
}
diff --git a/c/src/proactor/epoll.c b/c/src/proactor/epoll.c
index 1ff68ef9..027ef2fe 100644
--- a/c/src/proactor/epoll.c
+++ b/c/src/proactor/epoll.c
@@ -1197,7 +1197,7 @@ static pn_event_batch_t *pconnection_process(pconnection_t *pc, uint32_t events,
if (waking) {
pn_connection_t *c = pc->driver.connection;
- pn_collector_put(pn_connection_collector(c), PN_OBJECT, c, PN_CONNECTION_WAKE);
+ pn_collector_put_object(pn_connection_collector(c), c, PN_CONNECTION_WAKE);
waking = false;
}
diff --git a/c/src/proactor/libuv.c b/c/src/proactor/libuv.c
index b450919e..9179823a 100644
--- a/c/src/proactor/libuv.c
+++ b/c/src/proactor/libuv.c
@@ -886,7 +886,7 @@ static void check_wake(pconnection_t *pc) {
uv_mutex_lock(&pc->lock);
if (pc->wake == W_PENDING) {
pn_connection_t *c = pc->driver.connection;
- pn_collector_put(pn_connection_collector(c), PN_OBJECT, c, PN_CONNECTION_WAKE);
+ pn_collector_put_object(pn_connection_collector(c), c, PN_CONNECTION_WAKE);
pc->wake = W_NONE;
}
uv_mutex_unlock(&pc->lock);
diff --git a/c/src/proactor/win_iocp.cpp b/c/src/proactor/win_iocp.cpp
index 51512bd7..4df6d7d8 100644
--- a/c/src/proactor/win_iocp.cpp
+++ b/c/src/proactor/win_iocp.cpp
@@ -2351,7 +2351,7 @@ static pn_event_batch_t *pconnection_process(pconnection_t *pc, iocp_result_t *r
bool ready = pconnection_has_event(pc);
if (waking) {
pn_connection_t *c = pc->driver.connection;
- pn_collector_put(pn_connection_collector(c), PN_OBJECT, c, PN_CONNECTION_WAKE);
+ pn_collector_put_object(pn_connection_collector(c), c, PN_CONNECTION_WAKE);
waking = false;
}
if (ready) {
diff --git a/c/src/reactor/reactor.c b/c/src/reactor/reactor.c
index 213b9f4e..27f2c717 100644
--- a/c/src/reactor/reactor.c
+++ b/c/src/reactor/reactor.c
@@ -199,7 +199,7 @@ pn_selectable_t *pn_reactor_selectable(pn_reactor_t *reactor) {
assert(reactor);
pn_selectable_t *sel = pn_selectable();
pn_selectable_collect(sel, reactor->collector);
- pn_collector_put(reactor->collector, PN_OBJECT, sel, PN_SELECTABLE_INIT);
+ pn_collector_put_object(reactor->collector, sel, PN_SELECTABLE_INIT);
pni_selectable_set_context(sel, reactor);
pn_list_add(reactor->children, sel);
pn_selectable_on_release(sel, pni_selectable_release);
@@ -216,9 +216,9 @@ void pn_reactor_update(pn_reactor_t *reactor, pn_selectable_t *selectable) {
if (!pn_record_has(record, PNI_TERMINATED)) {
if (pn_selectable_is_terminal(selectable)) {
pn_record_def(record, PNI_TERMINATED, PN_VOID);
- pn_collector_put(reactor->collector, PN_OBJECT, selectable, PN_SELECTABLE_FINAL);
+ pn_collector_put_object(reactor->collector, selectable, PN_SELECTABLE_FINAL);
} else {
- pn_collector_put(reactor->collector, PN_OBJECT, selectable, PN_SELECTABLE_UPDATED);
+ pn_collector_put_object(reactor->collector, selectable, PN_SELECTABLE_UPDATED);
}
}
}
@@ -427,7 +427,7 @@ bool pn_reactor_process(pn_reactor_t *reactor) {
pn_collector_pop(reactor->collector);
} else if (!reactor->stop && pni_reactor_more(reactor)) {
if (previous != PN_REACTOR_QUIESCED && reactor->previous != PN_REACTOR_FINAL) {
- pn_collector_put(reactor->collector, PN_OBJECT, reactor, PN_REACTOR_QUIESCED);
+ pn_collector_put_object(reactor->collector, reactor, PN_REACTOR_QUIESCED);
} else {
return true;
}
@@ -438,7 +438,7 @@ bool pn_reactor_process(pn_reactor_t *reactor) {
reactor->selectable = NULL;
} else {
if (reactor->previous != PN_REACTOR_FINAL)
- pn_collector_put(reactor->collector, PN_OBJECT, reactor, PN_REACTOR_FINAL);
+ pn_collector_put_object(reactor->collector, reactor, PN_REACTOR_FINAL);
return false;
}
}
@@ -483,7 +483,7 @@ int pn_reactor_wakeup(pn_reactor_t *reactor) {
void pn_reactor_start(pn_reactor_t *reactor) {
assert(reactor);
- pn_collector_put(reactor->collector, PN_OBJECT, reactor, PN_REACTOR_INIT);
+ pn_collector_put_object(reactor->collector, reactor, PN_REACTOR_INIT);
reactor->selectable = pni_timer_selectable(reactor);
}
diff --git a/c/src/reactor/selectable.c b/c/src/reactor/selectable.c
index 9ee5e9ef..e9bf55dd 100644
--- a/c/src/reactor/selectable.c
+++ b/c/src/reactor/selectable.c
@@ -276,19 +276,19 @@ void pn_selectable_free(pn_selectable_t *selectable)
}
static void pni_readable(pn_selectable_t *selectable) {
- pn_collector_put(selectable->collector, PN_OBJECT, selectable, PN_SELECTABLE_READABLE);
+ pn_collector_put_object(selectable->collector, selectable, PN_SELECTABLE_READABLE);
}
static void pni_writable(pn_selectable_t *selectable) {
- pn_collector_put(selectable->collector, PN_OBJECT, selectable, PN_SELECTABLE_WRITABLE);
+ pn_collector_put_object(selectable->collector, selectable, PN_SELECTABLE_WRITABLE);
}
static void pni_error(pn_selectable_t *selectable) {
- pn_collector_put(selectable->collector, PN_OBJECT, selectable, PN_SELECTABLE_ERROR);
+ pn_collector_put_object(selectable->collector, selectable, PN_SELECTABLE_ERROR);
}
static void pni_expired(pn_selectable_t *selectable) {
- pn_collector_put(selectable->collector, PN_OBJECT, selectable, PN_SELECTABLE_EXPIRED);
+ pn_collector_put_object(selectable->collector, selectable, PN_SELECTABLE_EXPIRED);
}
void pn_selectable_collect(pn_selectable_t *selectable, pn_collector_t *collector) {
diff --git a/c/src/reactor/timer.c b/c/src/reactor/timer.c
index 1e187223..316b08be 100644
--- a/c/src/reactor/timer.c
+++ b/c/src/reactor/timer.c
@@ -158,7 +158,7 @@ void pn_timer_tick(pn_timer_t *timer, pn_timestamp_t now) {
pn_task_t *min = (pn_task_t *) pn_list_minpop(timer->tasks);
assert(min == task);
if (!min->cancelled)
- pn_collector_put(timer->collector, PN_OBJECT, min, PN_TIMER_TASK);
+ pn_collector_put_object(timer->collector, min, PN_TIMER_TASK);
pn_decref(min);
} else {
break;
diff --git a/c/src/sasl/sasl.c b/c/src/sasl/sasl.c
index 1fc16a9d..3de63aa4 100644
--- a/c/src/sasl/sasl.c
+++ b/c/src/sasl/sasl.c
@@ -375,7 +375,7 @@ static void pni_emit(pn_transport_t *transport)
{
if (transport->connection && transport->connection->collector) {
pn_collector_t *collector = transport->connection->collector;
- pn_collector_put(collector, PN_OBJECT, transport, PN_TRANSPORT);
+ pn_collector_put_object(collector, transport, PN_TRANSPORT);
}
}
diff --git a/c/tests/event_test.cpp b/c/tests/event_test.cpp
index 0a93b5cd..03657f1b 100644
--- a/c/tests/event_test.cpp
+++ b/c/tests/event_test.cpp
@@ -35,7 +35,7 @@ TEST_CASE("event_collector") {
pn_collector_t *collector = pn_collector(); \
REQUIRE(collector); \
pn_event_t *event = \
- pn_collector_put(collector, PN_OBJECT, obj, (pn_event_type_t)0); \
+ pn_collector_put_object(collector, obj, (pn_event_type_t)0); \
pn_decref(obj);
TEST_CASE("event_collector_put") {
@@ -71,7 +71,7 @@ TEST_CASE("event_collector_pool") {
REQUIRE(!head);
void *obj2 = pn_class_new(PN_OBJECT, 0);
pn_event_t *event2 =
- pn_collector_put(collector, PN_OBJECT, obj2, (pn_event_type_t)0);
+ pn_collector_put_object(collector, obj2, (pn_event_type_t)0);
pn_decref(obj2);
REQUIRE(event == event2);
pn_free(collector);
@@ -87,7 +87,7 @@ void test_event_incref(bool eventfirst) {
REQUIRE(!pn_collector_peek(collector));
void *obj2 = pn_class_new(PN_OBJECT, 0);
pn_event_t *event2 =
- pn_collector_put(collector, PN_OBJECT, obj2, (pn_event_type_t)0);
+ pn_collector_put_object(collector, obj2, (pn_event_type_t)0);
pn_decref(obj2);
REQUIRE(head != event2);
if (eventfirst) {
diff --git a/cpp/src/receiver.cpp b/cpp/src/receiver.cpp
index 325036df..9f3c7706 100644
--- a/cpp/src/receiver.cpp
+++ b/cpp/src/receiver.cpp
@@ -78,7 +78,7 @@ void receiver::drain() {
// Drain is already complete. No state to communicate over the wire.
// Create dummy flow event where "drain finish" can be detected.
pn_connection_t *pnc = pn_session_connection(pn_link_session(pn_object()));
- pn_collector_put(pn_connection_collector(pnc), PN_OBJECT, pn_object(), PN_LINK_FLOW);
+ pn_collector_put_object(pn_connection_collector(pnc), pn_object(), PN_LINK_FLOW);
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[qpid-proton] 03/09: PROTON-2542: Remove reify operation
Posted by as...@apache.org.
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 <as...@apache.org>
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: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[qpid-proton] 05/09: PROTON-2542: Make the object system a bit clearer
Posted by as...@apache.org.
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 0a770196301376069bcddf5c624cb3726b3f4a40
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Tue Apr 26 16:17:06 2022 -0400
PROTON-2542: Make the object system a bit clearer
Avoid duplicating identical function bodies; Use NULL entries where they
have the same effect as the function specified.
---
c/include/proton/object.h | 9 +++------
c/src/core/object/map.c | 10 ++++++----
c/src/core/object/object.c | 25 ++++++++++++++-----------
python/cproton.i | 10 +++-------
python/setup.py | 2 +-
5 files changed, 27 insertions(+), 29 deletions(-)
diff --git a/c/include/proton/object.h b/c/include/proton/object.h
index 0412c393..fb8236db 100644
--- a/c/include/proton/object.h
+++ b/c/include/proton/object.h
@@ -114,9 +114,9 @@ const pn_class_t PN_CLASSCLASS(PREFIX)[] = {{ \
pn_void_refcount, \
NULL, /* _finalize */ \
NULL, /* _free */ \
- pn_void_hashcode, \
- pn_void_compare, \
- pn_void_inspect \
+ NULL, /* _hashcode */ \
+ NULL, /* _compare */ \
+ NULL, /* _inspect */ \
}}; \
PN_EXTERN pn_cid_t pn_class_id(const pn_class_t *clazz);
@@ -143,9 +143,6 @@ PN_EXTERN void *pn_void_new(const pn_class_t *clazz, size_t size);
PN_EXTERN void pn_void_incref(void *object);
PN_EXTERN void pn_void_decref(void *object);
PN_EXTERN int pn_void_refcount(void *object);
-PN_EXTERN uintptr_t pn_void_hashcode(void *object);
-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 void pn_object_incref(void *object);
diff --git a/c/src/core/object/map.c b/c/src/core/object/map.c
index 38d64547..9ee154c8 100644
--- a/c/src/core/object/map.c
+++ b/c/src/core/object/map.c
@@ -397,12 +397,14 @@ static bool pni_identity_equals(void *a, void *b)
#define CID_pni_uintptr CID_pn_void
#define pni_uintptr_new NULL
-#define pni_uintptr_free NULL
#define pni_uintptr_initialize NULL
-static void pni_uintptr_incref(void *object) {}
-static void pni_uintptr_decref(void *object) {}
-static int pni_uintptr_refcount(void *object) { return -1; }
#define pni_uintptr_finalize NULL
+#define pni_uintptr_free NULL
+
+#define pni_uintptr_incref pn_void_incref
+#define pni_uintptr_decref pn_void_decref
+#define pni_uintptr_refcount pn_void_refcount
+
#define pni_uintptr_hashcode NULL
#define pni_uintptr_compare NULL
#define pni_uintptr_inspect NULL
diff --git a/c/src/core/object/object.c b/c/src/core/object/object.c
index a664150d..040f4113 100644
--- a/c/src/core/object/object.c
+++ b/c/src/core/object/object.c
@@ -29,21 +29,23 @@
#define pn_object_initialize NULL
#define pn_object_finalize NULL
#define pn_object_inspect NULL
-uintptr_t pn_object_hashcode(void *object) { return (uintptr_t) object; }
-intptr_t pn_object_compare(void *a, void *b) { return (intptr_t) a - (intptr_t) b; }
+#define pn_object_hashcode NULL
+#define pn_object_compare NULL
const pn_class_t PN_OBJECT[] = {PN_CLASS(pn_object)};
-#define pn_void_initialize NULL
void *pn_void_new(const pn_class_t *clazz, size_t size) { return pni_mem_allocate(clazz, size); }
+#define pn_void_initialize NULL
+#define pn_void_finalize NULL
+static void pn_void_free(void *object) { pni_mem_deallocate(PN_VOID, object); }
+
void pn_void_incref(void* p) {}
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); }
-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); }
+
+#define pn_void_hashcode NULL
+#define pn_void_compare NULL
+#define pn_void_inspect NULL
const pn_class_t PN_VOID[] = {PN_METACLASS(pn_void)};
@@ -352,9 +354,10 @@ int pn_inspect(void *object, pn_string_t *dst)
#define pn_weakref_finalize NULL
#define pn_weakref_free NULL
-static void pn_weakref_incref(void *object) {}
-static void pn_weakref_decref(void *object) {}
-static int pn_weakref_refcount(void *object) { return -1; }
+#define pn_weakref_incref pn_void_incref
+#define pn_weakref_decref pn_void_decref
+#define pn_weakref_refcount pn_void_refcount
+
static uintptr_t pn_weakref_hashcode(void *object) {
return pn_hashcode(object);
}
diff --git a/python/cproton.i b/python/cproton.i
index f12271df..6bb68e4b 100644
--- a/python/cproton.i
+++ b/python/cproton.i
@@ -422,9 +422,9 @@ int pn_ssl_get_cert_fingerprint(pn_ssl_t *ssl, char *OUTPUT, size_t MAX_OUTPUT_S
#define pn_pyref_initialize NULL
#define pn_pyref_finalize NULL
#define pn_pyref_free NULL
- #define pn_pyref_hashcode pn_void_hashcode
- #define pn_pyref_compare pn_void_compare
- #define pn_pyref_inspect pn_void_inspect
+ #define pn_pyref_hashcode NULL
+ #define pn_pyref_compare NULL
+ #define pn_pyref_inspect NULL
static void pn_pyref_incref(void *object) {
PyObject* p = (PyObject*) object;
@@ -444,10 +444,6 @@ int pn_ssl_get_cert_fingerprint(pn_ssl_t *ssl, char *OUTPUT, size_t MAX_OUTPUT_S
return 1;
}
- static const pn_class_t *pn_pyref_reify(void *object) {
- return PN_PYREF;
- }
-
const pn_class_t PN_PYREF[] = {PN_METACLASS(pn_pyref)};
void *pn_py2void(PyObject *object) {
diff --git a/python/setup.py b/python/setup.py
index f677570a..5e7d0722 100644
--- a/python/setup.py
+++ b/python/setup.py
@@ -155,7 +155,7 @@ class BuildExtension(build_ext):
"""Check to see if the proper version of the Proton development library
and headers are already installed
"""
- return misc.pkg_config_version_installed('libqpid-proton-core', atleast='0')
+ return misc.pkg_config_version_installed('libqpid-proton-core', atleast='0.38')
def use_installed_proton(self):
"""The Proton development headers and library are installed, update the
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[qpid-proton] 04/09: PROTON-2542: Flatten out all direct pn_ object operations
Posted by as...@apache.org.
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 cd417188ac938ecfb0b10bf7b5f99e234a2e6a51
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Tue Apr 26 16:39:00 2022 -0400
PROTON-2542: Flatten out all direct pn_ object operations
Flattened out: pn_incref, pn_decref, pn_refcount, pn_free, pn_class,
pn_hashcode, pn_compare, pn_inspect. This avoids much calling overhead.
---
c/src/core/object/object.c | 95 ++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 87 insertions(+), 8 deletions(-)
diff --git a/c/src/core/object/object.c b/c/src/core/object/object.c
index 13686a2f..a664150d 100644
--- a/c/src/core/object/object.c
+++ b/c/src/core/object/object.c
@@ -225,37 +225,101 @@ void pn_object_free(void *object)
void *pn_incref(void *object)
{
- return pn_class_incref(PN_OBJECT, object);
+ if (object) {
+ const pn_class_t *clazz = pni_head(object)->clazz;
+ clazz->incref(object);
+ }
+ return object;
}
int pn_decref(void *object)
{
- return pn_class_decref(PN_OBJECT, object);
+ if (object) {
+ const pn_class_t *clazz = pni_head(object)->clazz;
+ clazz->decref(object);
+ int rc = clazz->refcount(object);
+ if (rc == 0) {
+ if (clazz->finalize) {
+ clazz->finalize(object);
+ // check the refcount again in case the finalizer created a
+ // new reference
+ rc = clazz->refcount(object);
+ }
+ if (rc == 0) {
+ clazz->free(object);
+ return 0;
+ }
+ } else {
+ return rc;
+ }
+ }
+ return 0;
}
int pn_refcount(void *object)
{
- return pn_class_refcount(PN_OBJECT, object);
+ assert(object);
+ const pn_class_t *clazz = pni_head(object)->clazz;
+ return clazz->refcount(object);
}
void pn_free(void *object)
{
- pn_class_free(PN_OBJECT, object);
+ if (object) {
+ const pn_class_t *clazz = pni_head(object)->clazz;
+ int rc = clazz->refcount(object);
+ assert(rc == 1 || rc == -1);
+ if (rc == 1) {
+ clazz->decref(object);
+ assert(clazz->refcount(object) == 0);
+ if (clazz->finalize) {
+ clazz->finalize(object);
+ }
+ if (clazz->refcount(object) == 0) {
+ clazz->free(object);
+ }
+ } else {
+ if (clazz->finalize) {
+ clazz->finalize(object);
+ }
+ clazz->free(object);
+ }
+ }
}
const pn_class_t *pn_class(void *object)
{
- return pn_class_reify(PN_OBJECT, object);
+ if (object) {
+ return pni_head(object)->clazz;
+ } else {
+ return PN_OBJECT;
+ }
}
uintptr_t pn_hashcode(void *object)
{
- return pn_class_hashcode(PN_OBJECT, object);
+ if (!object) return 0;
+
+ const pn_class_t *clazz = pni_head(object)->clazz;
+
+ if (clazz->hashcode) {
+ return clazz->hashcode(object);
+ } else {
+ return (uintptr_t) object;
+ }
}
intptr_t pn_compare(void *a, void *b)
{
- return pn_class_compare(PN_OBJECT, a, b);
+ if (a == b) return 0;
+
+ if (a && b) {
+ const pn_class_t *clazz = pni_head(a)->clazz;
+ if (clazz->compare) {
+ return clazz->compare(a, b);
+ }
+ }
+ return (intptr_t) a - (intptr_t) b;
}
bool pn_equals(void *a, void *b)
@@ -265,7 +329,22 @@ bool pn_equals(void *a, void *b)
int pn_inspect(void *object, pn_string_t *dst)
{
- return pn_class_inspect(PN_OBJECT, object, dst);
+ if (!pn_string_get(dst)) {
+ pn_string_set(dst, "");
+ }
+
+ if (!object) {
+ return pn_string_addf(dst, "pn_object<%p>", object);
+ }
+
+ const pn_class_t *clazz = pni_head(object)->clazz;
+
+ if (clazz->inspect) {
+ return clazz->inspect(object, dst);
+ }
+
+ const char *name = clazz->name ? clazz->name : "<anon>";
+ return pn_string_addf(dst, "%s<%p>", name, object);
}
#define pn_weakref_new NULL
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[qpid-proton] 08/09: PROTON-2542: Make PN_OBJECT generic object management
Posted by as...@apache.org.
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 40b302f983df29ae31bb4a2bcb0ab8e350017217
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Mon May 9 18:03:03 2022 -0400
PROTON-2542: Make PN_OBJECT generic object management
Rename the previous PN_OBJECT to PN_DEFAULT as it contains the default
handling for all object based classes. PN_OBJECT is now a memory
management strategy used for containers which incorporates the behaviour
that was previously implemented by reify.
This means that PN_OBJECT can be used as the container class type for
generic objects.
---
c/include/proton/object.h | 1 +
c/src/core/object/object.c | 68 +++++++++++++++++++++++++++++++++++----------
c/src/messenger/messenger.c | 2 +-
c/tests/event_test.cpp | 6 ++--
c/tests/object_test.cpp | 40 +++++++++++++-------------
5 files changed, 79 insertions(+), 38 deletions(-)
diff --git a/c/include/proton/object.h b/c/include/proton/object.h
index d89dd927..3db65640 100644
--- a/c/include/proton/object.h
+++ b/c/include/proton/object.h
@@ -66,6 +66,7 @@ struct pn_class_t {
/* Hack alert: Declare these as arrays so we can treat the name of the single
object as the address */
+PN_EXTERN extern const pn_class_t PN_DEFAULT[];
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[];
diff --git a/c/src/core/object/object.c b/c/src/core/object/object.c
index 86707c48..b5296063 100644
--- a/c/src/core/object/object.c
+++ b/c/src/core/object/object.c
@@ -26,13 +26,14 @@
#include <stdlib.h>
#include <assert.h>
-#define pn_object_initialize NULL
-#define pn_object_finalize NULL
-#define pn_object_inspect NULL
-#define pn_object_hashcode NULL
-#define pn_object_compare NULL
+#define CID_pn_default CID_pn_object
+#define pn_default_initialize NULL
+#define pn_default_finalize NULL
+#define pn_default_inspect NULL
+#define pn_default_hashcode NULL
+#define pn_default_compare NULL
-const pn_class_t PN_OBJECT[] = {PN_CLASS(pn_object)};
+const pn_class_t PN_DEFAULT[] = {PN_CLASS(pn_default)};
void *pn_void_new(const pn_class_t *clazz, size_t size) { return pni_mem_allocate(clazz, size); }
#define pn_void_initialize NULL
@@ -334,7 +335,7 @@ const pn_class_t *pn_class(void *object)
if (object) {
return pni_head(object)->clazz;
} else {
- return PN_OBJECT;
+ return PN_DEFAULT;
}
}
@@ -398,14 +399,53 @@ int pn_inspect(void *object, pn_string_t *dst)
#define pn_weakref_decref pn_void_decref
#define pn_weakref_refcount pn_void_refcount
-static uintptr_t pn_weakref_hashcode(void *object) {
- return pn_hashcode(object);
+#define pn_weakref_hashcode pn_hashcode
+#define pn_weakref_compare pn_compare
+#define pn_weakref_inspect pn_inspect
+
+const pn_class_t PN_WEAKREF[] = {PN_METACLASS(pn_weakref)};
+
+#define CID_pn_strongref CID_pn_object
+#define pn_strongref_new NULL
+
+void pn_strongref_initialize(void *object) {
+ const pn_class_t *clazz = pni_head(object)->clazz;
+ if (clazz->initialize) {
+ clazz->initialize(object);
+ }
+}
+
+void pn_strongref_finalize(void *object) {
+ const pn_class_t *clazz = pni_head(object)->clazz;
+ if (clazz->finalize) {
+ clazz->finalize(object);
+ }
+}
+
+void pn_strongref_free(void *object)
+{
+ const pn_class_t *clazz = pni_head(object)->clazz;
+ pni_class_free(clazz, object);
}
-static intptr_t pn_weakref_compare(void *a, void *b) {
- return pn_compare(a, b);
+
+void pn_strongref_incref(void *object)
+{
+ const pn_class_t *clazz = pni_head(object)->clazz;
+ pni_class_incref(clazz, object);
}
-static int pn_weakref_inspect(void *object, pn_string_t *dst) {
- return pn_inspect(object, dst);
+void pn_strongref_decref(void *object)
+{
+ const pn_class_t *clazz = pni_head(object)->clazz;
+ pni_class_decref(clazz, object);
+}
+int pn_strongref_refcount(void *object)
+{
+ const pn_class_t *clazz = pni_head(object)->clazz;
+ return pni_class_refcount(clazz, object);
}
-const pn_class_t PN_WEAKREF[] = {PN_METACLASS(pn_weakref)};
+#define pn_strongref_hashcode pn_hashcode
+#define pn_strongref_compare pn_compare
+#define pn_strongref_inspect pn_inspect
+
+const pn_class_t PN_OBJECT[] = {PN_METACLASS(pn_strongref)};
diff --git a/c/src/messenger/messenger.c b/c/src/messenger/messenger.c
index 60cef79c..add1491a 100644
--- a/c/src/messenger/messenger.c
+++ b/c/src/messenger/messenger.c
@@ -389,7 +389,7 @@ static pn_listener_ctx_t *pn_listener_ctx(pn_messenger_t *messenger,
return NULL;
}
- pn_listener_ctx_t *ctx = (pn_listener_ctx_t *) pn_class_new(PN_OBJECT, sizeof(pn_listener_ctx_t));
+ pn_listener_ctx_t *ctx = (pn_listener_ctx_t *) pn_class_new(PN_DEFAULT, sizeof(pn_listener_ctx_t));
ctx->messenger = messenger;
ctx->domain = pn_ssl_domain(PN_SSL_MODE_SERVER);
if (messenger->certificate) {
diff --git a/c/tests/event_test.cpp b/c/tests/event_test.cpp
index 03657f1b..3d2faf69 100644
--- a/c/tests/event_test.cpp
+++ b/c/tests/event_test.cpp
@@ -31,7 +31,7 @@ TEST_CASE("event_collector") {
}
#define SETUP_COLLECTOR \
- void *obj = pn_class_new(PN_OBJECT, 0); \
+ void *obj = pn_class_new(PN_DEFAULT, 0); \
pn_collector_t *collector = pn_collector(); \
REQUIRE(collector); \
pn_event_t *event = \
@@ -69,7 +69,7 @@ TEST_CASE("event_collector_pool") {
pn_collector_pop(collector);
head = pn_collector_peek(collector);
REQUIRE(!head);
- void *obj2 = pn_class_new(PN_OBJECT, 0);
+ void *obj2 = pn_class_new(PN_DEFAULT, 0);
pn_event_t *event2 =
pn_collector_put_object(collector, obj2, (pn_event_type_t)0);
pn_decref(obj2);
@@ -85,7 +85,7 @@ void test_event_incref(bool eventfirst) {
pn_incref(head);
pn_collector_pop(collector);
REQUIRE(!pn_collector_peek(collector));
- void *obj2 = pn_class_new(PN_OBJECT, 0);
+ void *obj2 = pn_class_new(PN_DEFAULT, 0);
pn_event_t *event2 =
pn_collector_put_object(collector, obj2, (pn_event_type_t)0);
pn_decref(obj2);
diff --git a/c/tests/object_test.cpp b/c/tests/object_test.cpp
index 944b96ee..c5a30237 100644
--- a/c/tests/object_test.cpp
+++ b/c/tests/object_test.cpp
@@ -152,7 +152,7 @@ static void test_class(const pn_class_t *clazz, size_t size) {
}
TEST_CASE("object_class") {
- test_class(PN_OBJECT, 0);
+ test_class(PN_DEFAULT, 0);
test_class(PN_VOID, 5);
test_class(&noop_class, 128);
}
@@ -172,8 +172,8 @@ static void test_new(size_t size, const pn_class_t *clazz) {
}
TEST_CASE("object_class new") {
- test_new(0, PN_OBJECT);
- test_new(5, PN_OBJECT);
+ test_new(0, PN_DEFAULT);
+ test_new(5, PN_DEFAULT);
test_new(128, &noop_class);
}
@@ -263,7 +263,7 @@ TEST_CASE("object_compare") {
TEST_CASE("object_refcounting") {
int refs = 3;
- void *obj = pn_class_new(PN_OBJECT, 0);
+ void *obj = pn_class_new(PN_DEFAULT, 0);
CHECK(pn_refcount(obj) == 1);
@@ -304,10 +304,10 @@ TEST_CASE("list") {
}
TEST_CASE("list_refcount") {
- void *one = pn_class_new(PN_OBJECT, 0);
- void *two = pn_class_new(PN_OBJECT, 0);
- void *three = pn_class_new(PN_OBJECT, 0);
- void *four = pn_class_new(PN_OBJECT, 0);
+ void *one = pn_class_new(PN_DEFAULT, 0);
+ void *two = pn_class_new(PN_DEFAULT, 0);
+ void *three = pn_class_new(PN_DEFAULT, 0);
+ void *four = pn_class_new(PN_DEFAULT, 0);
pn_list_t *list = pn_list(PN_OBJECT, 0);
CHECK(!pn_list_add(list, one));
@@ -446,16 +446,16 @@ TEST_CASE("map_build_odd") {
}
TEST_CASE("map") {
- void *one = pn_class_new(PN_OBJECT, 0);
- void *two = pn_class_new(PN_OBJECT, 0);
- void *three = pn_class_new(PN_OBJECT, 0);
+ void *one = pn_class_new(PN_DEFAULT, 0);
+ void *two = pn_class_new(PN_DEFAULT, 0);
+ void *three = pn_class_new(PN_DEFAULT, 0);
pn_string_t *key = pn_string("key");
pn_string_t *dup = pn_string("key");
pn_string_t *key1 = pn_string("key1");
pn_string_t *key2 = pn_string("key2");
- pn_map_t *map = pn_map(pn_class(key), PN_OBJECT, 4, 0.75);
+ pn_map_t *map = pn_map(PN_OBJECT, PN_OBJECT, 4, 0.75);
CHECK(pn_map_size(map) == 0);
CHECK(!pn_map_put(map, key, one));
@@ -508,9 +508,9 @@ TEST_CASE("map") {
}
TEST_CASE("hash") {
- void *one = pn_class_new(PN_OBJECT, 0);
- void *two = pn_class_new(PN_OBJECT, 0);
- void *three = pn_class_new(PN_OBJECT, 0);
+ void *one = pn_class_new(PN_DEFAULT, 0);
+ void *two = pn_class_new(PN_DEFAULT, 0);
+ void *three = pn_class_new(PN_DEFAULT, 0);
pn_hash_t *hash = pn_hash(PN_OBJECT, 4, 0.75);
pn_hash_put(hash, 0, NULL);
@@ -679,8 +679,8 @@ TEST_CASE("map_iteration") {
int n = 5;
pn_list_t *pairs = pn_list(PN_OBJECT, 2 * n);
for (int i = 0; i < n; i++) {
- void *key = pn_class_new(PN_OBJECT, 0);
- void *value = pn_class_new(PN_OBJECT, 0);
+ void *key = pn_class_new(PN_DEFAULT, 0);
+ void *value = pn_class_new(PN_DEFAULT, 0);
pn_list_add(pairs, key);
pn_list_add(pairs, value);
pn_decref(key);
@@ -893,9 +893,9 @@ TEST_CASE("list_compare") {
CHECK(pn_equals(a, b));
- void *one = pn_class_new(PN_OBJECT, 0);
- void *two = pn_class_new(PN_OBJECT, 0);
- void *three = pn_class_new(PN_OBJECT, 0);
+ void *one = pn_class_new(PN_DEFAULT, 0);
+ void *two = pn_class_new(PN_DEFAULT, 0);
+ void *three = pn_class_new(PN_DEFAULT, 0);
pn_list_add(a, one);
CHECK(!pn_equals(a, b));
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[qpid-proton] 01/09: PROTON-2542: Eliminate PN_CLASSDEF mechanism in favour of PN_CLASS
Posted by as...@apache.org.
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 <as...@apache.org>
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: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[qpid-proton] 09/09: PROTON-2542: Remove last vestiges of now unnecessary "reify" operation
Posted by as...@apache.org.
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 005789172947c2e567ddbc6e8a8c783951313fd9
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Tue May 3 17:58:18 2022 -0400
PROTON-2542: Remove last vestiges of now unnecessary "reify" operation
We have now removed every previous case that relied on the object system
looking up the actual class of an object and this is now entirely
delegated to the objct classes themselves. This means we can remove the
generic code that looks up the object class in all of the general paths.
---
c/src/core/event.c | 4 ----
c/src/core/object/object.c | 21 ---------------------
2 files changed, 25 deletions(-)
diff --git a/c/src/core/event.c b/c/src/core/event.c
index 1fa62d9d..3f81f707 100644
--- a/c/src/core/event.c
+++ b/c/src/core/event.c
@@ -167,10 +167,6 @@ 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/object.c b/c/src/core/object/object.c
index b5296063..318b3d95 100644
--- a/c/src/core/object/object.c
+++ b/c/src/core/object/object.c
@@ -162,9 +162,6 @@ void *pn_class_new(const pn_class_t *clazz, size_t size)
void *pn_class_incref(const pn_class_t *clazz, void *object)
{
if (object) {
- if (clazz==PN_OBJECT) {
- clazz = pni_head(object)->clazz;
- }
pni_class_incref(clazz, object);
}
return object;
@@ -172,19 +169,12 @@ void *pn_class_incref(const pn_class_t *clazz, void *object)
int pn_class_refcount(const pn_class_t *clazz, void *object)
{
- if (clazz==PN_OBJECT) {
- clazz = pn_class(object);
- }
-
return pni_class_refcount(clazz, object);
}
int pn_class_decref(const pn_class_t *clazz, void *object)
{
if (object) {
- if (clazz==PN_OBJECT) {
- clazz = pni_head(object)->clazz;
- }
pni_class_decref(clazz, object);
int rc = pni_class_refcount(clazz, object);
if (rc == 0) {
@@ -209,10 +199,6 @@ int pn_class_decref(const pn_class_t *clazz, void *object)
void pn_class_free(const pn_class_t *clazz, void *object)
{
if (object) {
- if (clazz==PN_OBJECT) {
- clazz = pni_head(object)->clazz;
- }
-
int rc = pni_class_refcount(clazz, object);
assert(rc == 1 || rc == -1);
if (rc == 1) {
@@ -232,9 +218,6 @@ intptr_t pn_class_compare(const pn_class_t *clazz, void *a, void *b)
if (a == b) return 0;
if (a && b) {
- if (clazz==PN_OBJECT) {
- clazz = pni_head(a)->clazz;
- }
if (clazz->compare) {
return clazz->compare(a, b);
}
@@ -249,10 +232,6 @@ 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)
{
- if (clazz==PN_OBJECT) {
- clazz = pni_head(object)->clazz;
- }
-
if (!pn_string_get(dst)) {
pn_string_set(dst, "");
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org
[qpid-proton] 07/09: PROTON-2542: Eliminate uses of PN_OBJECT in uses of pn_list, pn_map & pn_hash
Posted by as...@apache.org.
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 e09c3e299771c7c6c2467077ff1fe05079b6d740
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Mon May 2 18:33:22 2022 -0400
PROTON-2542: Eliminate uses of PN_OBJECT in uses of pn_list, pn_map & pn_hash
As we now explicitly tell every container what the actual type of its
content is we no longer need to do this lookup in the object system
itself. This allows us to remove the final vestiges of the reify
operation,
There are a few uses left where the actual type is in fact PN_OBJECT
---
.gitignore | 2 +
c/src/core/engine.c | 24 ++++++-----
c/src/core/event.c | 16 +++++---
c/src/handlers/iohandler.c | 2 +-
c/src/messenger/messenger.c | 2 +-
c/src/messenger/store.c | 18 ++++-----
c/src/messenger/subscription.c | 9 +++--
c/src/messenger/subscription.h | 2 +
c/src/messenger/transform.c | 6 +--
c/src/proactor/win_iocp.cpp | 8 ++--
c/src/reactor/acceptor.c | 4 +-
c/src/reactor/connection.c | 4 +-
c/src/reactor/handler.c | 7 ++--
c/src/reactor/io/windows/iocp.c | 11 ++---
c/src/reactor/io/windows/iocp.h | 2 +
c/src/reactor/io/windows/selector.c | 2 +-
c/src/reactor/reactor.c | 2 +-
c/src/reactor/selectable.c | 4 +-
c/src/reactor/selectable.h | 2 +
c/src/reactor/timer.c | 8 ++--
c/tests/object_test.cpp | 81 ++++++++++++++++++++++++-------------
c/tools/reactor-recv.c | 8 +++-
22 files changed, 137 insertions(+), 87 deletions(-)
diff --git a/.gitignore b/.gitignore
index 082a0591..5822d868 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,8 @@
/build*/
/bld*/
/BLD*/
+/out
+
*.class
*.o
*.d
diff --git a/c/src/core/engine.c b/c/src/core/engine.c
index b03d64eb..3e438553 100644
--- a/c/src/core/engine.c
+++ b/c/src/core/engine.c
@@ -41,6 +41,17 @@
static void pni_session_bound(pn_session_t *ssn);
static void pni_link_bound(pn_link_t *link);
+static void pn_delivery_incref(void *object);
+static void pn_delivery_finalize(void *object);
+#define pn_delivery_new NULL
+#define pn_delivery_refcount NULL
+#define pn_delivery_decref NULL
+#define pn_delivery_free NULL
+#define pn_delivery_initialize NULL
+#define pn_delivery_hashcode NULL
+#define pn_delivery_compare NULL
+static int pn_delivery_inspect(void *obj, pn_string_t *dst);
+static const pn_class_t PN_CLASSCLASS(pn_delivery) = PN_METACLASS(pn_delivery);
// endpoints
@@ -541,7 +552,7 @@ pn_connection_t *pn_connection()
conn->properties = pn_data(0);
conn->collector = NULL;
conn->context = pn_record();
- conn->delivery_pool = pn_list(PN_OBJECT, 0);
+ conn->delivery_pool = pn_list(&PN_CLASSCLASS(pn_delivery), 0);
conn->driver = NULL;
return conn;
@@ -1507,14 +1518,6 @@ static void pn_disposition_clear(pn_disposition_t *ds)
pn_condition_clear(&ds->condition);
}
-#define pn_delivery_new NULL
-#define pn_delivery_refcount NULL
-#define pn_delivery_decref NULL
-#define pn_delivery_free NULL
-#define pn_delivery_initialize NULL
-#define pn_delivery_hashcode NULL
-#define pn_delivery_compare NULL
-
int pn_delivery_inspect(void *obj, pn_string_t *dst) {
pn_delivery_t *d = (pn_delivery_t*)obj;
const char* dir = pn_link_is_sender(d->link) ? "sending" : "receiving";
@@ -1539,8 +1542,7 @@ pn_delivery_t *pn_delivery(pn_link_t *link, pn_delivery_tag_t tag)
pn_list_t *pool = link->session->connection->delivery_pool;
pn_delivery_t *delivery = (pn_delivery_t *) pn_list_pop(pool);
if (!delivery) {
- static const pn_class_t clazz = PN_METACLASS(pn_delivery);
- delivery = (pn_delivery_t *) pn_class_new(&clazz, sizeof(pn_delivery_t));
+ delivery = (pn_delivery_t *) pn_class_new(&PN_CLASSCLASS(pn_delivery), sizeof(pn_delivery_t));
if (!delivery) return NULL;
delivery->tag = pn_buffer(16);
delivery->bytes = pn_buffer(64);
diff --git a/c/src/core/event.c b/c/src/core/event.c
index 5afd45cd..1fa62d9d 100644
--- a/c/src/core/event.c
+++ b/c/src/core/event.c
@@ -41,10 +41,18 @@ struct pn_event_t {
pn_event_type_t type;
};
+static void pn_event_initialize(void *object);
+static void pn_event_finalize(void *object);
+static int pn_event_inspect(void *object, pn_string_t *string);
+#define pn_event_hashcode NULL
+#define pn_event_compare NULL
+
+static const pn_class_t PN_CLASSCLASS(pn_event) = PN_CLASS(pn_event);
+
static void pn_collector_initialize(void* object)
{
pn_collector_t *collector = (pn_collector_t *)object;
- collector->pool = pn_list(PN_OBJECT, 0);
+ collector->pool = pn_list(&PN_CLASSCLASS(pn_event), 0);
collector->head = NULL;
collector->tail = NULL;
collector->prev = NULL;
@@ -278,13 +286,9 @@ static int pn_event_inspect(void *object, pn_string_t *dst)
return pn_string_addf(dst, ")");
}
-#define pn_event_hashcode NULL
-#define pn_event_compare NULL
-
pn_event_t *pn_event(void)
{
- static const pn_class_t clazz = PN_CLASS(pn_event);
- return pn_class_new(&clazz, sizeof(pn_event_t));
+ return pn_class_new(&PN_CLASSCLASS(pn_event), sizeof(pn_event_t));
}
pn_event_type_t pn_event_type(pn_event_t *event)
diff --git a/c/src/handlers/iohandler.c b/c/src/handlers/iohandler.c
index db18c0c7..f8357c5b 100644
--- a/c/src/handlers/iohandler.c
+++ b/c/src/handlers/iohandler.c
@@ -66,7 +66,7 @@ static void pn_iodispatch(pn_iohandler_t *handler, pn_event_t *event, pn_event_t
pn_selector_t *selector = (pn_selector_t *) pn_record_get(record, PN_SELECTOR);
if (!selector) {
selector = pn_io_selector(pni_reactor_io(reactor));
- pn_record_def(record, PN_SELECTOR, PN_OBJECT);
+ pn_record_def(record, PN_SELECTOR, pn_class(selector));
pn_record_set(record, PN_SELECTOR, selector);
pn_decref(selector);
}
diff --git a/c/src/messenger/messenger.c b/c/src/messenger/messenger.c
index bb7999d4..60cef79c 100644
--- a/c/src/messenger/messenger.c
+++ b/c/src/messenger/messenger.c
@@ -655,7 +655,7 @@ pn_messenger_t *pn_messenger(const char *name)
m->next_tag = 0;
m->outgoing = pni_store();
m->incoming = pni_store();
- m->subscriptions = pn_list(PN_OBJECT, 0);
+ m->subscriptions = pn_list(&PN_CLASSCLASS(pn_subscription), 0);
m->incoming_subscription = NULL;
m->error = pn_error();
m->routes = pn_transform();
diff --git a/c/src/messenger/store.c b/c/src/messenger/store.c
index 6f6e7723..3262cb20 100644
--- a/c/src/messenger/store.c
+++ b/c/src/messenger/store.c
@@ -77,6 +77,13 @@ void pni_entry_finalize(void *object)
}
}
+#define CID_pni_entry CID_pn_object
+#define pni_entry_initialize NULL
+#define pni_entry_hashcode NULL
+#define pni_entry_compare NULL
+#define pni_entry_inspect NULL
+static const pn_class_t PN_CLASSCLASS(pni_entry) = PN_CLASS(pni_entry);
+
pni_store_t *pni_store()
{
pni_store_t *store = (pni_store_t *) malloc(sizeof(pni_store_t));
@@ -89,7 +96,7 @@ pni_store_t *pni_store()
store->window = 0;
store->lwm = 0;
store->hwm = 0;
- store->tracked = pn_hash(PN_OBJECT, 0, 0.75);
+ store->tracked = pn_hash(&PN_CLASSCLASS(pni_entry), 0, 0.75);
return store;
}
@@ -199,21 +206,14 @@ pni_stream_t *pni_stream_get(pni_store_t *store, const char *address)
return pni_stream(store, address, false);
}
-#define CID_pni_entry CID_pn_object
-#define pni_entry_initialize NULL
-#define pni_entry_hashcode NULL
-#define pni_entry_compare NULL
-#define pni_entry_inspect NULL
-
pni_entry_t *pni_store_put(pni_store_t *store, const char *address)
{
assert(store);
- static const pn_class_t clazz = PN_CLASS(pni_entry);
if (!address) address = "";
pni_stream_t *stream = pni_stream_put(store, address);
if (!stream) return NULL;
- pni_entry_t *entry = (pni_entry_t *) pn_class_new(&clazz, sizeof(pni_entry_t));
+ pni_entry_t *entry = (pni_entry_t *) pn_class_new(&PN_CLASSCLASS(pni_entry), sizeof(pni_entry_t));
if (!entry) return NULL;
entry->stream = stream;
entry->free = false;
diff --git a/c/src/messenger/subscription.c b/c/src/messenger/subscription.c
index c26d40a1..c10d3c7c 100644
--- a/c/src/messenger/subscription.c
+++ b/c/src/messenger/subscription.c
@@ -19,6 +19,8 @@
*
*/
+#include "subscription.h"
+
#include <proton/messenger.h>
#include <proton/object.h>
#include <assert.h>
@@ -60,19 +62,20 @@ void pn_subscription_finalize(void *obj)
#define pn_subscription_compare NULL
#define pn_subscription_inspect NULL
+const pn_class_t PN_CLASSCLASS(pn_subscription) = PN_CLASS(pn_subscription);
+
pn_subscription_t *pn_subscription(pn_messenger_t *messenger,
const char *scheme,
const char *host,
const char *port)
{
- static const pn_class_t clazz = PN_CLASS(pn_subscription);
- pn_subscription_t *sub = (pn_subscription_t *) pn_class_new(&clazz, sizeof(pn_subscription_t));
+ pn_subscription_t *sub = (pn_subscription_t *) pn_class_new(&PN_CLASSCLASS(pn_subscription), sizeof(pn_subscription_t));
sub->messenger = messenger;
pn_string_set(sub->scheme, scheme);
pn_string_set(sub->host, host);
pn_string_set(sub->port, port);
pni_messenger_add_subscription(messenger, sub);
- pn_class_decref(PN_OBJECT, sub);
+ pn_decref(sub);
return sub;
}
diff --git a/c/src/messenger/subscription.h b/c/src/messenger/subscription.h
index a390eb5a..8325c4df 100644
--- a/c/src/messenger/subscription.h
+++ b/c/src/messenger/subscription.h
@@ -24,6 +24,8 @@
#include <proton/messenger.h>
+extern const pn_class_t PN_CLASSCLASS(pn_subscription);
+
pn_subscription_t *pn_subscription(pn_messenger_t *messenger,
const char *scheme, const char *host,
const char *port);
diff --git a/c/src/messenger/transform.c b/c/src/messenger/transform.c
index 9b726f89..8a5236b1 100644
--- a/c/src/messenger/transform.c
+++ b/c/src/messenger/transform.c
@@ -59,11 +59,11 @@ static void pn_rule_finalize(void *object)
#define pn_rule_hashcode NULL
#define pn_rule_compare NULL
#define pn_rule_inspect NULL
+static const pn_class_t PN_CLASSCLASS(pn_rule) = PN_CLASS(pn_rule);
pn_rule_t *pn_rule(const char *pattern, const char *substitution)
{
- static const pn_class_t clazz = PN_CLASS(pn_rule);
- pn_rule_t *rule = (pn_rule_t *) pn_class_new(&clazz, sizeof(pn_rule_t));
+ pn_rule_t *rule = (pn_rule_t *) pn_class_new(&PN_CLASSCLASS(pn_rule), sizeof(pn_rule_t));
rule->pattern = pn_string(pattern);
rule->substitution = pn_string(substitution);
return rule;
@@ -85,7 +85,7 @@ pn_transform_t *pn_transform()
{
static const pn_class_t clazz = PN_CLASS(pn_transform);
pn_transform_t *transform = (pn_transform_t *) pn_class_new(&clazz, sizeof(pn_transform_t));
- transform->rules = pn_list(PN_OBJECT, 0);
+ transform->rules = pn_list(&PN_CLASSCLASS(pn_rule), 0);
transform->matched = false;
return transform;
}
diff --git a/c/src/proactor/win_iocp.cpp b/c/src/proactor/win_iocp.cpp
index 4df6d7d8..7e7f1378 100644
--- a/c/src/proactor/win_iocp.cpp
+++ b/c/src/proactor/win_iocp.cpp
@@ -1186,13 +1186,13 @@ static uintptr_t pni_iocpdesc_hashcode(void *object)
#define pni_iocpdesc_compare NULL
#define pni_iocpdesc_inspect NULL
+#define CID_pni_iocpdesc CID_pn_void
+static pn_class_t PN_CLASSCLASS(pni_iocpdesc) = PN_CLASS(pni_iocpdesc);
// Reference counted in the iocpdesc map, zombie_list, selector.
static iocpdesc_t *pni_iocpdesc(pn_socket_t s)
{
- static const pn_cid_t CID_pni_iocpdesc = CID_pn_void;
- static pn_class_t clazz = PN_CLASS(pni_iocpdesc);
- iocpdesc_t *iocpd = (iocpdesc_t *) pn_class_new(&clazz, sizeof(iocpdesc_t));
+ iocpdesc_t *iocpd = (iocpdesc_t *) pn_class_new(&PN_CLASSCLASS(pni_iocpdesc), sizeof(iocpdesc_t));
assert(iocpd);
iocpd->socket = s;
return iocpd;
@@ -1514,7 +1514,7 @@ void pni_iocp_initialize(void *obj)
pni_shared_pool_create(iocp);
iocp->completion_port = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
assert(iocp->completion_port != NULL);
- iocp->zombie_list = pn_list(PN_OBJECT, 0);
+ iocp->zombie_list = pn_list(&PN_CLASSCLASS(pni_iocpdesc), 0);
iocp->iocp_trace = false;
}
diff --git a/c/src/reactor/acceptor.c b/c/src/reactor/acceptor.c
index a0447488..cc3b7d3e 100644
--- a/c/src/reactor/acceptor.c
+++ b/c/src/reactor/acceptor.c
@@ -60,7 +60,7 @@ void pni_acceptor_readable(pn_selectable_t *sel) {
pn_decref(trans);
pn_reactor_selectable_transport(reactor, sock, trans);
record = pn_connection_attachments(conn);
- pn_record_def(record, PNI_ACCEPTOR_CONNECTION, PN_OBJECT);
+ pn_record_def(record, PNI_ACCEPTOR_CONNECTION, pn_class(sel));
pn_record_set(record, PNI_ACCEPTOR_CONNECTION, sel);
}
@@ -83,7 +83,7 @@ pn_acceptor_t *pn_reactor_acceptor(pn_reactor_t *reactor, const char *host, cons
pn_selectable_on_finalize(sel, pni_acceptor_finalize);
pni_record_init_reactor(pn_selectable_attachments(sel), reactor);
pn_record_t *record = pn_selectable_attachments(sel);
- pn_record_def(record, PNI_ACCEPTOR_HANDLER, PN_OBJECT);
+ pn_record_def(record, PNI_ACCEPTOR_HANDLER, pn_class(handler));
pn_record_set(record, PNI_ACCEPTOR_HANDLER, handler);
pn_selectable_set_reading(sel, true);
pn_reactor_update(reactor, sel);
diff --git a/c/src/reactor/connection.c b/c/src/reactor/connection.c
index 15ec01ba..390a9fa2 100644
--- a/c/src/reactor/connection.c
+++ b/c/src/reactor/connection.c
@@ -47,7 +47,7 @@ void pni_reactor_set_connection_peer_address(pn_connection_t *connection,
pn_url_set_port(url, port);
pn_record_t *record = pn_connection_attachments(connection);
if (!pn_record_has(record, PNI_CONN_PEER_ADDRESS)) {
- pn_record_def(record, PNI_CONN_PEER_ADDRESS, PN_OBJECT);
+ pn_record_def(record, PNI_CONN_PEER_ADDRESS, pn_class(url));
}
pn_record_set(record, PNI_CONN_PEER_ADDRESS, url);
pn_decref(url);
@@ -311,7 +311,7 @@ pn_selectable_t *pn_reactor_selectable_transport(pn_reactor_t *reactor, pn_socke
pn_selectable_on_expired(sel, pni_connection_expired);
pn_selectable_on_finalize(sel, pni_connection_finalize);
pn_record_t *record = pn_selectable_attachments(sel);
- pn_record_def(record, PN_TRANCTX, PN_OBJECT);
+ pn_record_def(record, PN_TRANCTX, pn_class(transport));
pn_record_set(record, PN_TRANCTX, transport);
pn_record_t *tr = pn_transport_attachments(transport);
pn_record_def(tr, PN_TRANCTX, PN_WEAKREF);
diff --git a/c/src/reactor/handler.c b/c/src/reactor/handler.c
index 2f86afd8..5cb3fe10 100644
--- a/c/src/reactor/handler.c
+++ b/c/src/reactor/handler.c
@@ -49,14 +49,15 @@ void pn_handler_finalize(void *object) {
#define pn_handler_compare NULL
#define pn_handler_inspect NULL
+static const pn_class_t PN_CLASSCLASS(pn_handler) = PN_CLASS(pn_handler);
+
pn_handler_t *pn_handler(void (*dispatch)(pn_handler_t *, pn_event_t *, pn_event_type_t)) {
return pn_handler_new(dispatch, 0, NULL);
}
pn_handler_t *pn_handler_new(void (*dispatch)(pn_handler_t *, pn_event_t *, pn_event_type_t), size_t size,
void (*finalize)(pn_handler_t *)) {
- static const pn_class_t clazz = PN_CLASS(pn_handler);
- pn_handler_t *handler = (pn_handler_t *) pn_class_new(&clazz, sizeof(pn_handler_t) + size);
+ pn_handler_t *handler = (pn_handler_t *) pn_class_new(&PN_CLASSCLASS(pn_handler), sizeof(pn_handler_t) + size);
handler->dispatch = dispatch;
handler->finalize = finalize;
memset(pn_handler_mem(handler), 0, size);
@@ -84,7 +85,7 @@ void *pn_handler_mem(pn_handler_t *handler) {
void pn_handler_add(pn_handler_t *handler, pn_handler_t *child) {
assert(handler);
if (!handler->children) {
- handler->children = pn_list(PN_OBJECT, 0);
+ handler->children = pn_list(&PN_CLASSCLASS(pn_handler), 0);
}
pn_list_add(handler->children, child);
}
diff --git a/c/src/reactor/io/windows/iocp.c b/c/src/reactor/io/windows/iocp.c
index 30f1bceb..aeac8414 100644
--- a/c/src/reactor/io/windows/iocp.c
+++ b/c/src/reactor/io/windows/iocp.c
@@ -751,11 +751,12 @@ static uintptr_t pni_iocpdesc_hashcode(void *object)
#define pni_iocpdesc_compare NULL
#define pni_iocpdesc_inspect NULL
+pn_class_t PN_CLASSCLASS(pni_iocpdesc) = PN_CLASS(pni_iocpdesc);
+
// Reference counted in the iocpdesc map, zombie_list, selector.
static iocpdesc_t *pni_iocpdesc(pn_socket_t s)
{
- static pn_class_t clazz = PN_CLASS(pni_iocpdesc);
- iocpdesc_t *iocpd = (iocpdesc_t *) pn_class_new(&clazz, sizeof(iocpdesc_t));
+ iocpdesc_t *iocpd = (iocpdesc_t *) pn_class_new(&PN_CLASSCLASS(pni_iocpdesc), sizeof(iocpdesc_t));
assert(iocpd);
iocpd->socket = s;
return iocpd;
@@ -1023,7 +1024,7 @@ static void drain_zombie_completions(iocp_t *iocp)
static pn_list_t *iocp_map_close_all(iocp_t *iocp)
{
// Zombify stragglers, i.e. no pn_close() from the application.
- pn_list_t *externals = pn_list(PN_OBJECT, 0);
+ pn_list_t *externals = pn_list(&PN_CLASSCLASS(pni_iocpdesc), 0);
for (pn_handle_t entry = pn_hash_head(iocp->iocpdesc_map); entry;
entry = pn_hash_next(iocp->iocpdesc_map, entry)) {
iocpdesc_t *iocpd = (iocpdesc_t *) pn_hash_value(iocp->iocpdesc_map, entry);
@@ -1142,8 +1143,8 @@ void pni_iocp_initialize(void *obj)
pni_shared_pool_create(iocp);
iocp->completion_port = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
assert(iocp->completion_port != NULL);
- iocp->iocpdesc_map = pn_hash(PN_OBJECT, 0, 0.75);
- iocp->zombie_list = pn_list(PN_OBJECT, 0);
+ iocp->iocpdesc_map = pn_hash(&PN_CLASSCLASS(pni_iocpdesc), 0, 0.75);
+ iocp->zombie_list = pn_list(&PN_CLASSCLASS(pni_iocpdesc), 0);
iocp->iocp_trace = pn_env_bool("PN_TRACE_DRV");
iocp->selector = NULL;
}
diff --git a/c/src/reactor/io/windows/iocp.h b/c/src/reactor/io/windows/iocp.h
index d3018e4b..8f18d696 100644
--- a/c/src/reactor/io/windows/iocp.h
+++ b/c/src/reactor/io/windows/iocp.h
@@ -101,6 +101,8 @@ struct write_result_t {
pn_bytes_t buffer;
};
+extern pn_class_t PN_CLASSCLASS(pni_iocpdesc);
+
iocpdesc_t *pni_iocpdesc_create(iocp_t *, pn_socket_t s, bool external);
iocpdesc_t *pni_iocpdesc_map_get(iocp_t *, pn_socket_t s);
iocpdesc_t *pni_deadline_desc(iocp_t *);
diff --git a/c/src/reactor/io/windows/selector.c b/c/src/reactor/io/windows/selector.c
index 15da73bc..8c2eb6e6 100644
--- a/c/src/reactor/io/windows/selector.c
+++ b/c/src/reactor/io/windows/selector.c
@@ -62,7 +62,7 @@ void pn_selector_initialize(void *obj)
pn_selector_t *selector = (pn_selector_t *) obj;
selector->iocp = NULL;
selector->selectables = pn_list(PN_WEAKREF, 0);
- selector->iocp_descriptors = pn_list(PN_OBJECT, 0);
+ selector->iocp_descriptors = pn_list(&PN_CLASSCLASS(pni_iocpdesc), 0);
selector->current = 0;
selector->current_triggered = NULL;
selector->awoken = 0;
diff --git a/c/src/reactor/reactor.c b/c/src/reactor/reactor.c
index b1326739..df92cbe0 100644
--- a/c/src/reactor/reactor.c
+++ b/c/src/reactor/reactor.c
@@ -246,7 +246,7 @@ pn_handler_t *pn_record_get_handler(pn_record_t *record) {
void pn_record_set_handler(pn_record_t *record, pn_handler_t *handler) {
assert(record);
- pn_record_def(record, PN_HANDLER, PN_OBJECT);
+ pn_record_def(record, PN_HANDLER, pn_class(handler));
pn_record_set(record, PN_HANDLER, handler);
}
diff --git a/c/src/reactor/selectable.c b/c/src/reactor/selectable.c
index e9bf55dd..3ecdc3f6 100644
--- a/c/src/reactor/selectable.c
+++ b/c/src/reactor/selectable.c
@@ -99,11 +99,11 @@ void pn_selectable_finalize(void *object)
#define pn_selectable_hashcode NULL
#define pn_selectable_inspect NULL
#define pn_selectable_compare NULL
+const pn_class_t PN_CLASSCLASS(pn_selectable) = PN_CLASS(pn_selectable);
pn_selectable_t *pn_selectable(void)
{
- static const pn_class_t clazz = PN_CLASS(pn_selectable);
- return pn_class_new(&clazz, sizeof(pn_selectable_t));
+ return pn_class_new(&PN_CLASSCLASS(pn_selectable), sizeof(pn_selectable_t));
}
bool pn_selectable_is_reading(pn_selectable_t *sel) {
diff --git a/c/src/reactor/selectable.h b/c/src/reactor/selectable.h
index 7a5b80ba..2024a8ce 100644
--- a/c/src/reactor/selectable.h
+++ b/c/src/reactor/selectable.h
@@ -28,6 +28,8 @@
#include <proton/selectable.h>
+extern const pn_class_t PN_CLASSCLASS(pn_selectable);
+
void *pni_selectable_get_context(pn_selectable_t *selectable);
void pni_selectable_set_context(pn_selectable_t *selectable, void *context);
int pni_selectable_get_index(pn_selectable_t *selectable);
diff --git a/c/src/reactor/timer.c b/c/src/reactor/timer.c
index 316b08be..5283a8fe 100644
--- a/c/src/reactor/timer.c
+++ b/c/src/reactor/timer.c
@@ -62,9 +62,9 @@ intptr_t pn_task_compare(void *a, void *b) {
#define pn_task_inspect NULL
#define pn_task_hashcode NULL
+static const pn_class_t PN_CLASSCLASS(pn_task) = PN_CLASS(pn_task);
pn_task_t *pn_task(void) {
- static const pn_class_t clazz = PN_CLASS(pn_task);
- pn_task_t *task = pn_class_new(&clazz, sizeof(pn_task_t));
+ pn_task_t *task = pn_class_new(&PN_CLASSCLASS(pn_task), sizeof(pn_task_t));
return task;
}
@@ -90,8 +90,8 @@ struct pn_timer_t {
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);
+ timer->pool = pn_list(&PN_CLASSCLASS(pn_task), 0);
+ timer->tasks = pn_list(&PN_CLASSCLASS(pn_task), 0);
}
static void pn_timer_finalize(void *object) {
diff --git a/c/tests/object_test.cpp b/c/tests/object_test.cpp
index 85889559..944b96ee 100644
--- a/c/tests/object_test.cpp
+++ b/c/tests/object_test.cpp
@@ -33,18 +33,26 @@ static char mem;
static void *END = &mem;
static pn_list_t *build_list(size_t capacity, ...) {
- pn_list_t *result = pn_list(PN_OBJECT, capacity);
va_list ap;
-
va_start(ap, capacity);
+
+ pn_list_t *result;
+ void *arg = va_arg(ap, void *);
+ bool last = arg == END;
+ // No information about list types assume everything is PN_OBJECT
+ if (last) {
+ result = pn_list(PN_OBJECT, capacity);
+ return result;
+ }
+ result = pn_list(pn_class(arg), capacity);
while (true) {
- void *arg = va_arg(ap, void *);
if (arg == END) {
break;
}
pn_list_add(result, arg);
- pn_class_decref(PN_OBJECT, arg);
+ pn_decref(arg);
+ arg = va_arg(ap, void *);
}
va_end(ap);
@@ -52,33 +60,47 @@ static pn_list_t *build_list(size_t capacity, ...) {
}
static pn_map_t *build_map(float load_factor, size_t capacity, ...) {
- pn_map_t *result = pn_map(PN_OBJECT, PN_OBJECT, capacity, load_factor);
va_list ap;
+ va_start(ap, capacity);
- void *prev = NULL;
+ pn_map_t *result;
+ void *prev = va_arg(ap, void *);
+ bool last = prev == END;
+ // No information about map types assume everything is PN_OBJECT
+ if (last) {
+ result = pn_map(PN_OBJECT, PN_OBJECT, capacity, load_factor);
+ return result;
+ }
+ void *arg = va_arg(ap, void *);
+ last = arg == END;
+ // Only know type of key assume value is PN_OBJECT
+ if (last) {
+ result = pn_map(pn_class(prev), PN_OBJECT, capacity, load_factor);
+ pn_map_put(result, prev, NULL);
+ pn_decref(prev);
+ return result;
+ }
+ result = pn_map(pn_class(prev), pn_class(arg), capacity, load_factor);
- va_start(ap, capacity);
- int count = 0;
while (true) {
- void *arg = va_arg(ap, void *);
- bool last = arg == END;
- if (arg == END) {
- arg = NULL;
- }
+ pn_map_put(result, prev, arg);
+ pn_decref(prev);
+ pn_decref(arg);
- if (count % 2) {
- pn_map_put(result, prev, arg);
- pn_class_decref(PN_OBJECT, prev);
- pn_class_decref(PN_OBJECT, arg);
- } else {
- prev = arg;
+ prev = va_arg(ap, void *);
+ last = prev == END;
+ if (last) {
+ break;
}
+ arg = va_arg(ap, void *);
+ last = arg == END;
+
if (last) {
+ pn_map_put(result, prev, NULL);
+ pn_decref(prev);
break;
}
-
- count++;
}
va_end(ap);
@@ -139,7 +161,7 @@ static void test_new(size_t size, const pn_class_t *clazz) {
INFO("class=" << pn_class_name(clazz) << " size=" << size);
void *obj = pn_class_new(clazz, size);
REQUIRE(obj);
- CHECK(pn_class_refcount(PN_OBJECT, obj) == 1);
+ CHECK(pn_refcount(obj) == 1);
CHECK(pn_class(obj) == clazz);
char *bytes = (char *)obj;
for (size_t i = 0; i < size; i++) {
@@ -428,14 +450,14 @@ TEST_CASE("map") {
void *two = pn_class_new(PN_OBJECT, 0);
void *three = pn_class_new(PN_OBJECT, 0);
- pn_map_t *map = pn_map(PN_OBJECT, PN_OBJECT, 4, 0.75);
- CHECK(pn_map_size(map) == 0);
-
pn_string_t *key = pn_string("key");
pn_string_t *dup = pn_string("key");
pn_string_t *key1 = pn_string("key1");
pn_string_t *key2 = pn_string("key2");
+ pn_map_t *map = pn_map(pn_class(key), PN_OBJECT, 4, 0.75);
+ CHECK(pn_map_size(map) == 0);
+
CHECK(!pn_map_put(map, key, one));
CHECK(pn_map_size(map) == 1);
CHECK(!pn_map_put(map, key1, two));
@@ -723,6 +745,7 @@ TEST_CASE("map_inspect") {
// note that when there is more than one entry in a map, the order
// of the entries is dependent on the hashes involved, it will be
// deterministic though
+ // Fake key to tell build_map that the map type is string.
pn_map_t *m = build_map(0.75, 0, END);
test_inspect(m, "{}");
pn_free(m);
@@ -743,10 +766,12 @@ TEST_CASE("map_inspect") {
}
TEST_CASE("map_coalesced_chain") {
- pn_hash_t *map = pn_hash(PN_OBJECT, 16, 0.75);
pn_string_t *values[9] = {pn_string("a"), pn_string("b"), pn_string("c"),
pn_string("d"), pn_string("e"), pn_string("f"),
pn_string("g"), pn_string("h"), pn_string("i")};
+
+ pn_hash_t *map = pn_hash(pn_class(values[0]), 16, 0.75);
+
// add some items:
pn_hash_put(map, 1, values[0]);
pn_hash_put(map, 2, values[1]);
@@ -798,11 +823,13 @@ TEST_CASE("map_coalesced_chain") {
}
TEST_CASE("map_coalesced_chain2") {
- pn_hash_t *map = pn_hash(PN_OBJECT, 16, 0.75);
pn_string_t *values[10] = {pn_string("a"), pn_string("b"), pn_string("c"),
pn_string("d"), pn_string("e"), pn_string("f"),
pn_string("g"), pn_string("h"), pn_string("i"),
pn_string("j")};
+
+ pn_hash_t *map = pn_hash(pn_class(values[0]), 16, 0.75);
+
// add some items:
pn_hash_put(map, 1, values[0]); // a
pn_hash_put(map, 2, values[1]); // b
diff --git a/c/tools/reactor-recv.c b/c/tools/reactor-recv.c
index a8764922..2463a95a 100644
--- a/c/tools/reactor-recv.c
+++ b/c/tools/reactor-recv.c
@@ -157,6 +157,9 @@ void connection_dispatch(pn_handler_t *h, pn_event_t *event, pn_event_type_t typ
check(cc->recv_link == NULL, "Multiple incoming links on one connection");
cc->recv_link = link;
pn_connection_t *conn = pn_event_connection(event);
+ if (!cc->global->active_connections) {
+ cc->global->active_connections = pn_list(pn_class(conn), 1);
+ }
pn_list_add(cc->global->active_connections, conn);
if (cc->global->shutting_down) {
pn_connection_close(conn);
@@ -247,7 +250,9 @@ void connection_dispatch(pn_handler_t *h, pn_event_t *event, pn_event_type_t typ
case PN_CONNECTION_UNBOUND:
{
pn_connection_t *conn = pn_event_connection(event);
- pn_list_remove(cc->global->active_connections, conn);
+ if (cc->global->active_connections) {
+ pn_list_remove(cc->global->active_connections, conn);
+ }
pn_connection_release(conn);
}
break;
@@ -292,7 +297,6 @@ void global_context_init(global_context_t *gc, Options_t *o, Statistics_t *s)
gc->message = pn_message();
check(gc->message, "failed to allocate a message");
gc->connections = 0;
- gc->active_connections = pn_list(PN_OBJECT, 0);
gc->acceptor = 0;
gc->shutting_down = false;
gc->listener_handler = 0;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org