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]

Reply via email to