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 <[email protected]> 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: [email protected] For additional commands, e-mail: [email protected]
