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