You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rh...@apache.org on 2014/09/15 21:19:35 UTC

svn commit: r1625121 - in /qpid/proton/trunk/proton-c: include/proton/ src/ src/codec/ src/engine/ src/events/ src/message/ src/messenger/ src/object/ src/posix/ src/tests/ src/transport/

Author: rhs
Date: Mon Sep 15 19:19:34 2014
New Revision: 1625121

URL: http://svn.apache.org/r1625121
Log:
made list and map take classes

Modified:
    qpid/proton/trunk/proton-c/include/proton/object.h
    qpid/proton/trunk/proton-c/src/codec/codec.c
    qpid/proton/trunk/proton-c/src/codec/decoder.c
    qpid/proton/trunk/proton-c/src/codec/encoder.c
    qpid/proton/trunk/proton-c/src/engine/engine.c
    qpid/proton/trunk/proton-c/src/events/event.c
    qpid/proton/trunk/proton-c/src/message/message.c
    qpid/proton/trunk/proton-c/src/messenger/messenger.c
    qpid/proton/trunk/proton-c/src/messenger/store.c
    qpid/proton/trunk/proton-c/src/messenger/subscription.c
    qpid/proton/trunk/proton-c/src/messenger/transform.c
    qpid/proton/trunk/proton-c/src/object/object.c
    qpid/proton/trunk/proton-c/src/posix/driver.c
    qpid/proton/trunk/proton-c/src/posix/io.c
    qpid/proton/trunk/proton-c/src/posix/selector.c
    qpid/proton/trunk/proton-c/src/selectable.c
    qpid/proton/trunk/proton-c/src/tests/object.c
    qpid/proton/trunk/proton-c/src/transport/transport.c

Modified: qpid/proton/trunk/proton-c/include/proton/object.h
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/include/proton/object.h?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/include/proton/object.h (original)
+++ qpid/proton/trunk/proton-c/include/proton/object.h Mon Sep 15 19:19:34 2014
@@ -43,6 +43,9 @@ typedef struct pn_hash_t pn_hash_t;
 typedef void *(*pn_iterator_next_t)(void *state);
 typedef struct pn_iterator_t pn_iterator_t;
 
+// XXX: if we factor refcounting stuff into a separate dimension then
+// we could have a weakref class instead of having the options stuff
+
 struct pn_class_t {
   const char *name;
   void *(*newinst)(const pn_class_t *, size_t);
@@ -93,13 +96,14 @@ extern const pn_class_t *PN_VOID;
 
 PN_EXTERN void *pn_class_new(const pn_class_t *clazz, size_t size);
 PN_EXTERN void *pn_class_incref(const pn_class_t *clazz, void *object);
-PN_EXTERN void 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 int pn_class_refcount(const pn_class_t *clazz, void *object);
+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);
 
 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);
@@ -107,19 +111,10 @@ PN_EXTERN void pn_object_incref(void *ob
 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_EXTERN uintptr_t pn_object_hashcode(void *object);
-PN_EXTERN intptr_t pn_object_compare(void *a, void *b);
-PN_EXTERN int pn_object_inspect(void *object, pn_string_t *dst);
-
-PN_EXTERN void *pn_new(size_t size, const pn_class_t* clazz);
-PN_EXTERN void *pn_new2(size_t size, const pn_class_t* clazz, void *from);
-PN_EXTERN void pn_initialize(void *object, const pn_class_t *clazz);
+
 PN_EXTERN void *pn_incref(void *object);
-PN_EXTERN void *pn_incref2(void *object, void *from);
-PN_EXTERN void pn_decref(void *object);
-PN_EXTERN void pn_decref2(void *object, void *from);
+PN_EXTERN int pn_decref(void *object);
 PN_EXTERN int pn_refcount(void *object);
-PN_EXTERN void pn_finalize(void *object);
 PN_EXTERN void pn_free(void *object);
 PN_EXTERN const pn_class_t *pn_class(void* object);
 PN_EXTERN uintptr_t pn_hashcode(void *object);
@@ -129,7 +124,7 @@ PN_EXTERN int pn_inspect(void *object, p
 
 #define PN_REFCOUNT (0x1)
 
-PN_EXTERN pn_list_t *pn_list(size_t capacity, int options);
+PN_EXTERN pn_list_t *pn_list(const pn_class_t *clazz, size_t capacity, int options);
 PN_EXTERN size_t pn_list_size(pn_list_t *list);
 PN_EXTERN void *pn_list_get(pn_list_t *list, int index);
 PN_EXTERN void pn_list_set(pn_list_t *list, int index, void *value);
@@ -143,7 +138,8 @@ PN_EXTERN void pn_list_iterator(pn_list_
 #define PN_REFCOUNT_KEY (0x2)
 #define PN_REFCOUNT_VALUE (0x4)
 
-PN_EXTERN pn_map_t *pn_map(size_t capacity, float load_factor, int options);
+PN_EXTERN pn_map_t *pn_map(const pn_class_t *key, const pn_class_t *value,
+                           size_t capacity, float load_factor, int options);
 PN_EXTERN size_t pn_map_size(pn_map_t *map);
 PN_EXTERN int pn_map_put(pn_map_t *map, void *key, void *value);
 PN_EXTERN void *pn_map_get(pn_map_t *map, void *key);
@@ -153,7 +149,7 @@ PN_EXTERN pn_handle_t pn_map_next(pn_map
 PN_EXTERN void *pn_map_key(pn_map_t *map, pn_handle_t entry);
 PN_EXTERN void *pn_map_value(pn_map_t *map, pn_handle_t entry);
 
-PN_EXTERN pn_hash_t *pn_hash(size_t capacity, float load_factor, int options);
+PN_EXTERN pn_hash_t *pn_hash(const pn_class_t *clazz, size_t capacity, float load_factor, int options);
 PN_EXTERN size_t pn_hash_size(pn_hash_t *hash);
 PN_EXTERN int pn_hash_put(pn_hash_t *hash, uintptr_t key, void *value);
 PN_EXTERN void *pn_hash_get(pn_hash_t *hash, uintptr_t key);

Modified: qpid/proton/trunk/proton-c/src/codec/codec.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/codec/codec.c?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/codec/codec.c (original)
+++ qpid/proton/trunk/proton-c/src/codec/codec.c Mon Sep 15 19:19:34 2014
@@ -367,7 +367,7 @@ static int pn_data_inspect(void *obj, pn
 pn_data_t *pn_data(size_t capacity)
 {
   static const pn_class_t clazz = PN_CLASS(pn_data);
-  pn_data_t *data = (pn_data_t *) pn_new(sizeof(pn_data_t), &clazz);
+  pn_data_t *data = (pn_data_t *) pn_class_new(&clazz, sizeof(pn_data_t));
   data->capacity = capacity;
   data->size = 0;
   data->nodes = capacity ? (pni_node_t *) malloc(capacity * sizeof(pni_node_t)) : NULL;

Modified: qpid/proton/trunk/proton-c/src/codec/decoder.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/codec/decoder.c?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/codec/decoder.c (original)
+++ qpid/proton/trunk/proton-c/src/codec/decoder.c Mon Sep 15 19:19:34 2014
@@ -55,7 +55,7 @@ static void pn_decoder_finalize(void *ob
 pn_decoder_t *pn_decoder()
 {
   static const pn_class_t clazz = PN_CLASS(pn_decoder);
-  return (pn_decoder_t *) pn_new(sizeof(pn_decoder_t), &clazz);
+  return (pn_decoder_t *) pn_class_new(&clazz, sizeof(pn_decoder_t));
 }
 
 static inline uint8_t pn_decoder_readf8(pn_decoder_t *decoder)

Modified: qpid/proton/trunk/proton-c/src/codec/encoder.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/codec/encoder.c?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/codec/encoder.c (original)
+++ qpid/proton/trunk/proton-c/src/codec/encoder.c Mon Sep 15 19:19:34 2014
@@ -57,7 +57,7 @@ static void pn_encoder_finalize(void *ob
 pn_encoder_t *pn_encoder()
 {
   static const pn_class_t clazz = PN_CLASS(pn_encoder);
-  return (pn_encoder_t *) pn_new(sizeof(pn_encoder_t), &clazz);
+  return (pn_encoder_t *) pn_class_new(&clazz, sizeof(pn_encoder_t));
 }
 
 static uint8_t pn_type2code(pn_encoder_t *encoder, pn_type_t type)

Modified: qpid/proton/trunk/proton-c/src/engine/engine.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/engine/engine.c?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/engine/engine.c (original)
+++ qpid/proton/trunk/proton-c/src/engine/engine.c Mon Sep 15 19:19:34 2014
@@ -189,7 +189,7 @@ void pn_add_session(pn_connection_t *con
 {
   pn_list_add(conn->sessions, ssn);
   ssn->connection = conn;
-  pn_incref2(conn, ssn);  // keep around until finalized
+  pn_incref(conn);  // keep around until finalized
 }
 
 void pn_remove_session(pn_connection_t *conn, pn_session_t *ssn)
@@ -227,7 +227,7 @@ void pn_session_free(pn_session_t *sessi
   pn_endpoint_t *endpoint = (pn_endpoint_t *) session;
   LL_REMOVE(pn_ep_get_connection(endpoint), endpoint, endpoint);
   session->endpoint.freed = true;
-  pn_decref2(session, session->connection);
+  pn_decref(session);
 }
 
 void *pn_session_get_context(pn_session_t *session)
@@ -289,10 +289,10 @@ void pn_link_free(pn_link_t *link)
   while (link->settled_head) {
     delivery = link->settled_head;
     LL_POP(link, settled, pn_delivery_t);
-    pn_decref2(delivery, link);
+    pn_decref(delivery);
   }
   link->endpoint.freed = true;
-  pn_decref2(link, link->session);
+  pn_decref(link);
 }
 
 void *pn_link_get_context(pn_link_t *link)
@@ -352,7 +352,7 @@ static void pn_connection_finalize(void 
     return;
   }
 
-  pn_decref2(conn->collector, conn);
+  pn_decref(conn->collector);
   pn_free(conn->sessions);
   pn_free(conn->container);
   pn_free(conn->hostname);
@@ -370,7 +370,7 @@ static void pn_connection_finalize(void 
 pn_connection_t *pn_connection()
 {
   static const pn_class_t clazz = PN_CLASS(pn_connection);
-  pn_connection_t *conn = (pn_connection_t *) pn_new(sizeof(pn_connection_t), &clazz);
+  pn_connection_t *conn = (pn_connection_t *) pn_class_new(&clazz, sizeof(pn_connection_t));
   if (!conn) return NULL;
 
   conn->context = NULL;
@@ -379,7 +379,7 @@ pn_connection_t *pn_connection()
   pn_endpoint_init(&conn->endpoint, CONNECTION, conn);
   conn->transport_head = NULL;
   conn->transport_tail = NULL;
-  conn->sessions = pn_list(0, 0);
+  conn->sessions = pn_list(PN_OBJECT, 0, 0);
   conn->transport = NULL;
   conn->work_head = NULL;
   conn->work_tail = NULL;
@@ -403,9 +403,9 @@ static const pn_event_type_t endpoint_in
 
 void pn_connection_collect(pn_connection_t *connection, pn_collector_t *collector)
 {
-  pn_decref2(connection->collector, connection);
+  pn_decref(connection->collector);
   connection->collector = collector;
-  pn_incref2(connection->collector, connection);
+  pn_incref(connection->collector);
   pn_endpoint_t *endpoint = connection->endpoint_head;
   while (endpoint) {
     pn_collector_put(connection->collector, endpoint_init_event_map[endpoint->type], endpoint);
@@ -558,7 +558,7 @@ void pn_add_tpwork(pn_delivery_t *delive
   {
     LL_ADD(connection, tpwork, delivery);
     delivery->tpwork = true;
-    pn_incref2(delivery, connection);
+    pn_incref(delivery);
   }
   pn_modified(connection, &connection->endpoint, true);
 }
@@ -570,7 +570,7 @@ void pn_clear_tpwork(pn_delivery_t *deli
   {
     LL_REMOVE(connection, tpwork, delivery);
     delivery->tpwork = false;
-    pn_decref2(delivery, connection);  // may free delivery!
+    pn_decref(delivery);  // may free delivery!
   }
 }
 
@@ -592,7 +592,7 @@ void pn_modified(pn_connection_t *connec
   if (!endpoint->modified) {
     LL_ADD(connection, transport, endpoint);
     endpoint->modified = true;
-    pn_incref2(endpoint, connection);
+    pn_incref(endpoint);
   }
 
   if (emit && connection->transport) {
@@ -608,7 +608,7 @@ void pn_clear_modified(pn_connection_t *
     endpoint->transport_next = NULL;
     endpoint->transport_prev = NULL;
     endpoint->modified = false;
-    pn_decref2(endpoint, connection);  // may free endpoint!
+    pn_decref(endpoint);  // may free endpoint!
   }
 }
 
@@ -706,7 +706,7 @@ static void pn_session_finalize(void *ob
   pn_delivery_map_free(&session->state.outgoing);
   pn_free(session->state.local_handles);
   pn_free(session->state.remote_handles);
-  pn_decref2(session->connection, session);
+  pn_decref(session->connection);
 }
 
 #define pn_session_initialize NULL
@@ -718,12 +718,12 @@ pn_session_t *pn_session(pn_connection_t
 {
   assert(conn);
   static const pn_class_t clazz = PN_CLASS(pn_session);
-  pn_session_t *ssn = (pn_session_t *) pn_new2(sizeof(pn_session_t), &clazz, conn);
+  pn_session_t *ssn = (pn_session_t *) pn_class_new(&clazz, sizeof(pn_session_t));
   if (!ssn) return NULL;
 
   pn_endpoint_init(&ssn->endpoint, SESSION, conn);
   pn_add_session(conn, ssn);
-  ssn->links = pn_list(0, 0);
+  ssn->links = pn_list(PN_OBJECT, 0, 0);
   ssn->context = 0;
   ssn->incoming_capacity = 1024*1024;
   ssn->incoming_bytes = 0;
@@ -737,8 +737,8 @@ pn_session_t *pn_session(pn_connection_t
   ssn->state.remote_channel = (uint16_t)-1;
   pn_delivery_map_init(&ssn->state.incoming, 0);
   pn_delivery_map_init(&ssn->state.outgoing, 0);
-  ssn->state.local_handles = pn_hash(0, 0.75, PN_REFCOUNT);
-  ssn->state.remote_handles = pn_hash(0, 0.75, PN_REFCOUNT);
+  ssn->state.local_handles = pn_hash(PN_OBJECT, 0, 0.75, PN_REFCOUNT);
+  ssn->state.remote_handles = pn_hash(PN_OBJECT, 0, 0.75, PN_REFCOUNT);
   // end transport state
 
   pn_collector_put(conn->collector, PN_SESSION_INIT, ssn);
@@ -814,7 +814,7 @@ static void pn_link_finalize(void *objec
   pn_terminus_free(&link->remote_target);
   pn_free(link->name);
   pn_endpoint_tini(endpoint);
-  pn_decref2(link->session, link);
+  pn_decref(link->session);
 }
 
 #define pn_link_initialize NULL
@@ -825,11 +825,11 @@ static void pn_link_finalize(void *objec
 pn_link_t *pn_link_new(int type, pn_session_t *session, const char *name)
 {
   static const pn_class_t clazz = PN_CLASS(pn_link);
-  pn_link_t *link = (pn_link_t *) pn_new2(sizeof(pn_link_t), &clazz, session);
+  pn_link_t *link = (pn_link_t *) pn_class_new(&clazz, sizeof(pn_link_t));
 
   pn_endpoint_init(&link->endpoint, type, session->connection);
   pn_add_link(session, link);
-  pn_incref2(session, link);  // keep session until link finalized
+  pn_incref(session);  // keep session until link finalized
   link->name = pn_string(name);
   pn_terminus_init(&link->source, PN_SOURCE);
   pn_terminus_init(&link->target, PN_TARGET);
@@ -1069,7 +1069,7 @@ static void pn_delivery_finalize(void *o
   pn_buffer_free(delivery->bytes);
   pn_disposition_finalize(&delivery->local);
   pn_disposition_finalize(&delivery->remote);
-  pn_decref2(delivery->link, delivery);
+  pn_decref(delivery->link);
 }
 
 static void pn_disposition_init(pn_disposition_t *ds)
@@ -1104,10 +1104,10 @@ pn_delivery_t *pn_delivery(pn_link_t *li
   LL_POP(link, settled, pn_delivery_t);
   if (!delivery) {
     static const pn_class_t clazz = PN_CLASS(pn_delivery);
-    delivery = (pn_delivery_t *) pn_new2(sizeof(pn_delivery_t), &clazz, link);
+    delivery = (pn_delivery_t *) pn_class_new(&clazz, sizeof(pn_delivery_t));
     if (!delivery) return NULL;
     delivery->link = link;
-    pn_incref2(delivery->link, delivery);  // keep link until finalized
+    pn_incref(delivery->link);  // keep link until finalized
     delivery->tag = pn_buffer(16);
     delivery->bytes = pn_buffer(64);
     pn_disposition_init(&delivery->local);

Modified: qpid/proton/trunk/proton-c/src/events/event.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/events/event.c?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/events/event.c (original)
+++ qpid/proton/trunk/proton-c/src/events/event.c Mon Sep 15 19:19:34 2014
@@ -81,7 +81,7 @@ static int pn_collector_inspect(void *ob
 pn_collector_t *pn_collector(void)
 {
   static const pn_class_t clazz = PN_CLASS(pn_collector);
-  pn_collector_t *collector = (pn_collector_t *) pn_new(sizeof(pn_collector_t), &clazz);
+  pn_collector_t *collector = (pn_collector_t *) pn_class_new(&clazz, sizeof(pn_collector_t));
   return collector;
 }
 
@@ -90,7 +90,7 @@ void pn_collector_free(pn_collector_t *c
   collector->freed = true;
   pn_collector_drain(collector);
   pn_collector_shrink(collector);
-  pn_decref(collector);
+  pn_class_decref(PN_OBJECT, collector);
 }
 
 pn_event_t *pn_event(void);
@@ -133,7 +133,7 @@ pn_event_t *pn_collector_put(pn_collecto
 
   event->type = type;
   event->context = context;
-  pn_incref2(event->context, collector);
+  pn_class_incref(PN_OBJECT, event->context);
 
   //printf("event %s on %p\n", pn_event_type_name(event->type), event->context);
 
@@ -160,7 +160,7 @@ bool pn_collector_pop(pn_collector_t *co
 
   // decref before adding to the free list
   if (event->context) {
-    pn_decref2(event->context, collector);
+    pn_class_decref(PN_OBJECT, event->context);
     event->context = NULL;
   }
 
@@ -201,7 +201,7 @@ static int pn_event_inspect(void *obj, p
 pn_event_t *pn_event(void)
 {
   static const pn_class_t clazz = PN_CLASS(pn_event);
-  pn_event_t *event = (pn_event_t *) pn_new(sizeof(pn_event_t), &clazz);
+  pn_event_t *event = (pn_event_t *) pn_class_new(&clazz, sizeof(pn_event_t));
   return event;
 }
 

Modified: qpid/proton/trunk/proton-c/src/message/message.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/message/message.c?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/message/message.c (original)
+++ qpid/proton/trunk/proton-c/src/message/message.c Mon Sep 15 19:19:34 2014
@@ -322,7 +322,7 @@ int pn_message_inspect(void *obj, pn_str
 pn_message_t *pn_message()
 {
   static const pn_class_t clazz = PN_CLASS(pn_message);
-  pn_message_t *msg = (pn_message_t *) pn_new(sizeof(pn_message_t), &clazz);
+  pn_message_t *msg = (pn_message_t *) pn_class_new(&clazz, sizeof(pn_message_t));
   msg->durable = false;
   msg->priority = PN_DEFAULT_PRIORITY;
   msg->ttl = 0;

Modified: qpid/proton/trunk/proton-c/src/messenger/messenger.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/messenger/messenger.c?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/messenger/messenger.c (original)
+++ qpid/proton/trunk/proton-c/src/messenger/messenger.c Mon Sep 15 19:19:34 2014
@@ -375,7 +375,7 @@ static pn_listener_ctx_t *pn_listener_ct
     return NULL;
   }
 
-  pn_listener_ctx_t *ctx = (pn_listener_ctx_t *) pn_new(sizeof(pn_listener_ctx_t), PN_OBJECT);
+  pn_listener_ctx_t *ctx = (pn_listener_ctx_t *) pn_class_new(PN_OBJECT, sizeof(pn_listener_ctx_t));
   ctx->messenger = messenger;
   ctx->domain = pn_ssl_domain(PN_SSL_MODE_SERVER);
   if (messenger->certificate) {
@@ -596,7 +596,7 @@ pn_messenger_t *pn_messenger(const char 
     m->blocking = true;
     m->passive = false;
     m->io = pn_io();
-    m->pending = pn_list(0, 0);
+    m->pending = pn_list(PN_OBJECT, 0, 0);
     m->interruptor = pni_selectable
       (pni_interruptor_capacity, pni_interruptor_pending,
        pni_interruptor_deadline, pni_interruptor_readable,
@@ -611,8 +611,8 @@ pn_messenger_t *pn_messenger(const char 
     pn_pipe(m->io, m->ctrl);
     pni_selectable_set_fd(m->interruptor, m->ctrl[0]);
     pni_selectable_set_context(m->interruptor, m);
-    m->listeners = pn_list(0, 0);
-    m->connections = pn_list(0, 0);
+    m->listeners = pn_list(PN_OBJECT, 0, 0);
+    m->connections = pn_list(PN_OBJECT, 0, 0);
     m->selector = pn_io_selector(m->io);
     m->collector = pn_collector();
     m->credit_mode = LINK_CREDIT_EXPLICIT;
@@ -621,13 +621,13 @@ pn_messenger_t *pn_messenger(const char 
     m->distributed = 0;
     m->receivers = 0;
     m->draining = 0;
-    m->credited = pn_list(0, 0);
-    m->blocked = pn_list(0, 0);
+    m->credited = pn_list(PN_OBJECT, 0, 0);
+    m->blocked = pn_list(PN_OBJECT, 0, 0);
     m->next_drain = 0;
     m->next_tag = 0;
     m->outgoing = pni_store();
     m->incoming = pni_store();
-    m->subscriptions = pn_list(0, PN_REFCOUNT);
+    m->subscriptions = pn_list(PN_OBJECT, 0, PN_REFCOUNT);
     m->incoming_subscription = NULL;
     m->error = pn_error();
     m->routes = pn_transform();

Modified: qpid/proton/trunk/proton-c/src/messenger/store.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/messenger/store.c?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/messenger/store.c (original)
+++ qpid/proton/trunk/proton-c/src/messenger/store.c Mon Sep 15 19:19:34 2014
@@ -89,7 +89,7 @@ pni_store_t *pni_store()
   store->window = 0;
   store->lwm = 0;
   store->hwm = 0;
-  store->tracked = pn_hash(0, 0.75, PN_REFCOUNT);
+  store->tracked = pn_hash(PN_OBJECT, 0, 0.75, PN_REFCOUNT);
 
   return store;
 }
@@ -210,7 +210,7 @@ pni_entry_t *pni_store_put(pni_store_t *
   if (!address) address = "";
   pni_stream_t *stream = pni_stream_put(store, address);
   if (!stream) return NULL;
-  pni_entry_t *entry = (pni_entry_t *) pn_new(sizeof(pni_entry_t), &clazz);
+  pni_entry_t *entry = (pni_entry_t *) pn_class_new(&clazz, sizeof(pni_entry_t));
   if (!entry) return NULL;
   entry->stream = stream;
   entry->free = false;

Modified: qpid/proton/trunk/proton-c/src/messenger/subscription.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/messenger/subscription.c?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/messenger/subscription.c (original)
+++ qpid/proton/trunk/proton-c/src/messenger/subscription.c Mon Sep 15 19:19:34 2014
@@ -65,13 +65,13 @@ pn_subscription_t *pn_subscription(pn_me
                                    const char *port)
 {
   static const pn_class_t clazz = PN_CLASS(pn_subscription);
-  pn_subscription_t *sub = (pn_subscription_t *) pn_new(sizeof(pn_subscription_t), &clazz);
+  pn_subscription_t *sub = (pn_subscription_t *) pn_class_new(&clazz, 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_decref(sub);
+  pn_class_decref(PN_OBJECT, sub);
   return sub;
 }
 

Modified: qpid/proton/trunk/proton-c/src/messenger/transform.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/messenger/transform.c?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/messenger/transform.c (original)
+++ qpid/proton/trunk/proton-c/src/messenger/transform.c Mon Sep 15 19:19:34 2014
@@ -63,7 +63,7 @@ static void pn_rule_finalize(void *objec
 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_new(sizeof(pn_rule_t), &clazz);
+  pn_rule_t *rule = (pn_rule_t *) pn_class_new(&clazz, sizeof(pn_rule_t));
   rule->pattern = pn_string(pattern);
   rule->substitution = pn_string(substitution);
   return rule;
@@ -83,8 +83,8 @@ static void pn_transform_finalize(void *
 pn_transform_t *pn_transform()
 {
   static const pn_class_t clazz = PN_CLASS(pn_transform);
-  pn_transform_t *transform = (pn_transform_t *) pn_new(sizeof(pn_transform_t), &clazz);
-  transform->rules = pn_list(0, PN_REFCOUNT);
+  pn_transform_t *transform = (pn_transform_t *) pn_class_new(&clazz, sizeof(pn_transform_t));
+  transform->rules = pn_list(PN_OBJECT, 0, PN_REFCOUNT);
   transform->matched = false;
   return transform;
 }

Modified: qpid/proton/trunk/proton-c/src/object/object.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/object/object.c?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/object/object.c (original)
+++ qpid/proton/trunk/proton-c/src/object/object.c Mon Sep 15 19:19:34 2014
@@ -30,6 +30,9 @@
 
 #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) b - (intptr_t) a; }
 
 const pn_class_t PNI_OBJECT = PN_CLASS(pn_object);
 const pn_class_t *PN_OBJECT = &PNI_OBJECT;
@@ -52,14 +55,20 @@ const pn_class_t *PN_VOID = &PNI_VOID;
 void *pn_class_new(const pn_class_t *clazz, size_t size)
 {
   assert(clazz);
-  return clazz->newinst(clazz, size);
+  void *object = clazz->newinst(clazz, size);
+  if (clazz->initialize) {
+    clazz->initialize(object);
+  }
+  return object;
 }
 
 void *pn_class_incref(const pn_class_t *clazz, void *object)
 {
   assert(clazz);
-  clazz = clazz->reify(object);
-  clazz->incref(object);
+  if (object) {
+    clazz = clazz->reify(object);
+    clazz->incref(object);
+  }
   return object;
 }
 
@@ -70,18 +79,50 @@ int pn_class_refcount(const pn_class_t *
   return clazz->refcount(object);
 }
 
-void pn_class_decref(const pn_class_t *clazz, void *object)
+int pn_class_decref(const pn_class_t *clazz, void *object)
 {
   assert(clazz);
-  clazz = clazz->reify(object);
-  clazz->decref(object);
+
+  if (object) {
+    clazz = clazz->reify(object);
+    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;
 }
 
 void pn_class_free(const pn_class_t *clazz, void *object)
 {
   assert(clazz);
-  clazz = clazz->reify(object);
-  clazz->free(object);
+  if (object) {
+    clazz = clazz->reify(object);
+    int rc = clazz->refcount(object);
+    assert(rc == 1 || rc == -1);
+    if (rc == 1) {
+      rc = pn_class_decref(clazz, object);
+      assert(rc == 0);
+    } else {
+      if (clazz->finalize) {
+        clazz->finalize(object);
+      }
+      clazz->free(object);
+    }
+  }
 }
 
 const pn_class_t *pn_class_reify(const pn_class_t *clazz, void *object)
@@ -125,6 +166,31 @@ bool pn_class_equals(const pn_class_t *c
   return pn_class_compare(clazz, a, b) == 0;
 }
 
+int pn_class_inspect(const pn_class_t *clazz, void *object, pn_string_t *dst)
+{
+  assert(clazz);
+
+  clazz = clazz->reify(object);
+
+  if (!pn_string_get(dst)) {
+    pn_string_set(dst, "");
+  }
+
+  const char *name;
+
+  if (object) {
+    if (clazz->inspect) {
+      return clazz->inspect(object, dst);
+    } else if (clazz->name) {
+      name = clazz->name;
+    } else {
+      name = "<anon>";
+    }
+  }
+
+  return pn_string_addf(dst, "%s<%p>", name, object);
+}
+
 typedef struct {
   const pn_class_t *clazz;
   int refcount;
@@ -135,7 +201,11 @@ typedef struct {
 
 void *pn_object_new(const pn_class_t *clazz, size_t size)
 {
-  return pn_new(size, clazz);
+  pni_head_t *head = (pni_head_t *) malloc(sizeof(pni_head_t) + size);
+  void *object = head + 1;
+  head->clazz = clazz;
+  head->refcount = 1;
+  return object;
 }
 
 const pn_class_t *pn_object_reify(void *object)
@@ -149,136 +219,58 @@ const pn_class_t *pn_object_reify(void *
 
 void pn_object_incref(void *object)
 {
-  pn_incref(object);
+  if (object) {
+    pni_head(object)->refcount++;
+  }
 }
 
 int pn_object_refcount(void *object)
 {
-  return pn_refcount(object);
+  assert(object);
+  return pni_head(object)->refcount;
 }
 
 void pn_object_decref(void *object)
 {
-  pn_decref(object);
+  pni_head_t *head = pni_head(object);
+  assert(head->refcount > 0);
+  head->refcount--;
 }
 
 void pn_object_free(void *object)
 {
-  pn_free(object);
-}
-
-uintptr_t pn_object_hashcode(void *object)
-{
-  return (uintptr_t) object;
-}
-
-intptr_t pn_object_compare(void *a, void *b)
-{
-  return (intptr_t) b - (intptr_t) a;
-}
-
-int pn_object_inspect(void *object, pn_string_t *dst)
-{
-  return pn_inspect(object, dst);
-}
-
-void *pn_new(size_t size, const pn_class_t *clazz)
-{
-  assert(clazz);
-  return pn_new2(size, clazz, NULL);
-}
-
-void *pn_new2(size_t size, const pn_class_t *clazz, void *from)
-{
-  pni_head_t *head = (pni_head_t *) malloc(sizeof(pni_head_t) + size);
-  void *object = head + 1;
-  pn_initialize(object, clazz);
-  return object;
-}
-
-void pn_initialize(void *object, const pn_class_t *clazz)
-{
   pni_head_t *head = pni_head(object);
-  head->clazz = clazz;
-  head->refcount = 1;
-  if (clazz && clazz->initialize) {
-    clazz->initialize(object);
-  }
+  free(head);
 }
 
-void *pn_incref(void *object) {
-  return pn_incref2(object, NULL);
-}
-
-void *pn_incref2(void *object, void *from) {
-  if (object) {
-    pni_head(object)->refcount++;
-  }
-  return object;
-}
-
-void pn_decref(void *object) {
-  pn_decref2(object, NULL);
-}
-
-void pn_decref2(void *object, void *from)
+void *pn_incref(void *object)
 {
-  if (object) {
-    pni_head_t *head = pni_head(object);
-    assert(head->refcount > 0);
-    head->refcount--;
-    if (!head->refcount) {
-      pn_finalize(object);
-      // Check the refcount again in case finalize created a new
-      // reference.
-      if (!head->refcount) {
-        free(head);
-      }
-    }
-  }
+  return pn_class_incref(PN_OBJECT, object);
 }
 
-void pn_finalize(void *object)
+int pn_decref(void *object)
 {
-  if (object) {
-    pni_head_t *head = pni_head(object);
-    assert(head->refcount == 0);
-    if (head->clazz && head->clazz->finalize) {
-      head->clazz->finalize(object);
-    }
-  }
+  return pn_class_decref(PN_OBJECT, object);
 }
 
 int pn_refcount(void *object)
 {
-  assert(object);
-  return pni_head(object)->refcount;
+  return pn_class_refcount(PN_OBJECT, object);
 }
 
 void pn_free(void *object)
 {
-  if (object) {
-    assert(pn_refcount(object) == 1);
-    pn_decref(object);
-  }
+  pn_class_free(PN_OBJECT, object);
 }
 
 const pn_class_t *pn_class(void *object)
 {
-  assert(object);
-  return pni_head(object)->clazz;
+  return pn_class_reify(PN_OBJECT, object);
 }
 
 uintptr_t pn_hashcode(void *object)
 {
-  if (!object) return 0;
-
-  pni_head_t *head = pni_head(object);
-  if (head->clazz && head->clazz->hashcode) {
-    return head->clazz->hashcode(object);
-  } else {
-    return (uintptr_t) head;
-  }
+  return pn_class_hashcode(PN_OBJECT, object);
 }
 
 intptr_t pn_compare(void *a, void *b)
@@ -293,32 +285,11 @@ bool pn_equals(void *a, void *b)
 
 int pn_inspect(void *object, pn_string_t *dst)
 {
-  if (!pn_string_get(dst)) {
-    pn_string_set(dst, "");
-  }
-
-  if (object) {
-    pni_head_t *head = pni_head(object);
-    const char *name;
-    if (head->clazz) {
-      const pn_class_t *clazz = head->clazz;
-      if (clazz->inspect) {
-        return clazz->inspect(object, dst);
-      } else if (clazz->name) {
-        name = clazz->name;
-      } else {
-        name = "object";
-      }
-    } else {
-      name = "object";
-    }
-    return pn_string_addf(dst, "%s<%p>", name, object);
-  } else {
-    return pn_string_addf(dst, "(null)");
-  }
+  return pn_class_inspect(PN_OBJECT, object, dst);
 }
 
 struct pn_list_t {
+  const pn_class_t *clazz;
   size_t capacity;
   size_t size;
   void **elements;
@@ -341,9 +312,9 @@ void pn_list_set(pn_list_t *list, int in
 {
   assert(list); assert(list->size);
   void *old = list->elements[index % list->size];
-  if (list->options & PN_REFCOUNT) pn_decref2(old, list);
+  if (list->options & PN_REFCOUNT) pn_class_decref(list->clazz, old);
   list->elements[index % list->size] = value;
-  if (list->options & PN_REFCOUNT) pn_incref2(value, list);
+  if (list->options & PN_REFCOUNT) pn_class_incref(list->clazz, value);
 }
 
 void pn_list_ensure(pn_list_t *list, size_t capacity)
@@ -363,7 +334,7 @@ int pn_list_add(pn_list_t *list, void *v
   assert(list);
   pn_list_ensure(list, list->size + 1);
   list->elements[list->size++] = value;
-  if (list->options & PN_REFCOUNT) pn_incref2(value, list);
+  if (list->options & PN_REFCOUNT) pn_class_incref(list->clazz, value);
   return 0;
 }
 
@@ -398,7 +369,7 @@ void pn_list_del(pn_list_t *list, int in
 
   if (list->options & PN_REFCOUNT) {
     for (int i = 0; i < n; i++) {
-      pn_decref2(list->elements[index + i], list);
+      pn_class_decref(list->clazz, list->elements[index + i]);
     }
   }
 
@@ -450,7 +421,7 @@ static void pn_list_finalize(void *objec
   assert(object);
   pn_list_t *list = (pn_list_t *) object;
   for (size_t i = 0; i < list->size; i++) {
-    if (list->options & PN_REFCOUNT) pn_decref2(pn_list_get(list, i), list);
+    if (list->options & PN_REFCOUNT) pn_class_decref(list->clazz, pn_list_get(list, i));
   }
   free(list->elements);
 }
@@ -500,7 +471,7 @@ static int pn_list_inspect(void *obj, pn
       err = pn_string_addf(dst, ", ");
       if (err) return err;
     }
-    err = pn_inspect(pn_list_get(list, i), dst);
+    err = pn_class_inspect(list->clazz, pn_list_get(list, i), dst);
     if (err) return err;
   }
   return pn_string_addf(dst, "]");
@@ -508,11 +479,12 @@ static int pn_list_inspect(void *obj, pn
 
 #define pn_list_initialize NULL
 
-pn_list_t *pn_list(size_t capacity, int options)
+pn_list_t *pn_list(const pn_class_t *clazz, size_t capacity, int options)
 {
-  static const pn_class_t clazz = PN_CLASS(pn_list);
+  static const pn_class_t list_clazz = PN_CLASS(pn_list);
 
-  pn_list_t *list = (pn_list_t *) pn_new(sizeof(pn_list_t), &clazz);
+  pn_list_t *list = (pn_list_t *) pn_class_new(&list_clazz, sizeof(pn_list_t));
+  list->clazz = clazz;
   list->capacity = capacity ? capacity : 16;
   list->elements = (void **) malloc(list->capacity * sizeof(void *));
   list->size = 0;
@@ -532,6 +504,8 @@ typedef struct {
 } pni_entry_t;
 
 struct pn_map_t {
+  const pn_class_t *key;
+  const pn_class_t *value;
   pni_entry_t *entries;
   size_t capacity;
   size_t addressable;
@@ -541,7 +515,6 @@ struct pn_map_t {
   float load_factor;
   bool count_keys;
   bool count_values;
-  bool inspect_keys;
 };
 
 static void pn_map_finalize(void *object)
@@ -551,8 +524,8 @@ static void pn_map_finalize(void *object
   if (map->count_keys || map->count_values) {
     for (size_t i = 0; i < map->capacity; i++) {
       if (map->entries[i].state != PNI_ENTRY_FREE) {
-        if (map->count_keys) pn_decref2(map->entries[i].key, map);
-        if (map->count_values) pn_decref2(map->entries[i].value, map);
+        if (map->count_keys) pn_class_decref(map->key, map->entries[i].key);
+        if (map->count_values) pn_class_decref(map->value, map->entries[i].value);
       }
     }
   }
@@ -604,15 +577,11 @@ static int pn_map_inspect(void *obj, pn_
       err = pn_string_addf(dst, ", ");
       if (err) return err;
     }
-    if (map->inspect_keys) {
-      err = pn_inspect(pn_map_key(map, entry), dst);
-    } else {
-      err = pn_string_addf(dst, "%p", pn_map_key(map, entry));
-    }
+    err = pn_class_inspect(map->key, pn_map_key(map, entry), dst);
     if (err) return err;
     err = pn_string_addf(dst, ": ");
     if (err) return err;
-    err = pn_inspect(pn_map_value(map, entry), dst);
+    err = pn_class_inspect(map->value, pn_map_value(map, entry), dst);
     if (err) return err;
     entry = pn_map_next(map, entry);
   }
@@ -622,11 +591,14 @@ static int pn_map_inspect(void *obj, pn_
 #define pn_map_initialize NULL
 #define pn_map_compare NULL
 
-pn_map_t *pn_map(size_t capacity, float load_factor, int options)
+pn_map_t *pn_map(const pn_class_t *key, const pn_class_t *value,
+                 size_t capacity, float load_factor, int options)
 {
   static const pn_class_t clazz = PN_CLASS(pn_map);
 
-  pn_map_t *map = (pn_map_t *) pn_new(sizeof(pn_map_t), &clazz);
+  pn_map_t *map = (pn_map_t *) pn_class_new(&clazz, sizeof(pn_map_t));
+  map->key = key;
+  map->value = value;
   map->capacity = capacity ? capacity : 16;
   map->addressable = (size_t) (map->capacity * 0.86);
   if (!map->addressable) map->addressable = map->capacity;
@@ -635,7 +607,6 @@ pn_map_t *pn_map(size_t capacity, float 
   map->equals = pn_equals;
   map->count_keys = (options & PN_REFCOUNT) || (options & PN_REFCOUNT_KEY);
   map->count_values = (options & PN_REFCOUNT) || (options & PN_REFCOUNT_VALUE);
-  map->inspect_keys = true;
   pni_map_allocate(map);
   return map;
 }
@@ -673,8 +644,8 @@ static bool pni_map_ensure(pn_map_t *map
       void *key = entries[i].key;
       void *value = entries[i].value;
       pn_map_put(map, key, value);
-      if (map->count_keys) pn_decref2(key, map);
-      if (map->count_values) pn_decref2(value, map);
+      if (map->count_keys) pn_class_decref(map->key, key);
+      if (map->count_values) pn_class_decref(map->value, value);
     }
   }
 
@@ -693,7 +664,7 @@ static pni_entry_t *pni_map_entry(pn_map
     if (create) {
       entry->state = PNI_ENTRY_TAIL;
       entry->key = key;
-      if (map->count_keys) pn_incref2(key, map);
+      if (map->count_keys) pn_class_incref(map->key, key);
       map->size++;
       return entry;
     } else {
@@ -733,7 +704,7 @@ static pni_entry_t *pni_map_entry(pn_map
     entry->state = PNI_ENTRY_LINK;
     map->entries[empty].state = PNI_ENTRY_TAIL;
     map->entries[empty].key = key;
-    if (map->count_keys) pn_incref2(key, map);
+    if (map->count_keys) pn_class_incref(map->key, key);
     if (pprev) *pprev = entry;
     map->size++;
     return &map->entries[empty];
@@ -746,9 +717,9 @@ int pn_map_put(pn_map_t *map, void *key,
 {
   assert(map);
   pni_entry_t *entry = pni_map_entry(map, key, NULL, true);
-  if (map->count_values) pn_decref2(entry->value, map);
+  if (map->count_values) pn_class_decref(map->value, entry->value);
   entry->value = value;
-  if (map->count_values) pn_incref2(value, map);
+  if (map->count_values) pn_class_incref(map->value, value);
   return 0;
 }
 
@@ -781,8 +752,8 @@ void pn_map_del(pn_map_t *map, void *key
     entry->key = NULL;
     entry->value = NULL;
     map->size--;
-    if (dref_key) pn_decref2(dref_key, map);
-    if (dref_value) pn_decref2(dref_value, map);
+    if (dref_key) pn_class_decref(map->key, dref_key);
+    if (dref_value) pn_class_decref(map->value, dref_value);
   }
 }
 
@@ -838,14 +809,33 @@ static bool pni_identity_equals(void *a,
   return a == b;
 }
 
-pn_hash_t *pn_hash(size_t capacity, float load_factor, int options)
+extern const pn_class_t *PN_UINTPTR;
+
+static const pn_class_t *pni_uintptr_reify(void *object) {
+  return PN_UINTPTR;
+}
+
+#define pni_uintptr_new NULL
+#define pni_uintptr_free NULL
+#define pni_uintptr_initialize NULL
+#define pni_uintptr_incref NULL
+#define pni_uintptr_decref NULL
+#define pni_uintptr_refcount NULL
+#define pni_uintptr_finalize NULL
+#define pni_uintptr_hashcode NULL
+#define pni_uintptr_compare NULL
+#define pni_uintptr_inspect NULL
+
+const pn_class_t PNI_UINTPTR = PN_METACLASS(pni_uintptr);
+const pn_class_t *PN_UINTPTR = &PNI_UINTPTR;
+
+pn_hash_t *pn_hash(const pn_class_t *clazz, size_t capacity, float load_factor, int options)
 {
-  pn_hash_t *hash = (pn_hash_t *) pn_map(capacity, load_factor, 0);
+  pn_hash_t *hash = (pn_hash_t *) pn_map(PN_UINTPTR, clazz, capacity, load_factor, 0);
   hash->map.hashcode = pni_identity_hashcode;
   hash->map.equals = pni_identity_equals;
   hash->map.count_keys = false;
   hash->map.count_values = options & PN_REFCOUNT;
-  hash->map.inspect_keys = false;
   return hash;
 }
 
@@ -967,7 +957,7 @@ pn_string_t *pn_string(const char *bytes
 pn_string_t *pn_stringn(const char *bytes, size_t n)
 {
   static const pn_class_t clazz = PN_CLASS(pn_string);
-  pn_string_t *string = (pn_string_t *) pn_new(sizeof(pn_string_t), &clazz);
+  pn_string_t *string = (pn_string_t *) pn_class_new(&clazz, sizeof(pn_string_t));
   string->capacity = n ? n * sizeof(char) : 16;
   string->bytes = (char *) malloc(string->capacity);
   pn_string_setn(string, bytes, n);
@@ -1156,7 +1146,7 @@ static void pn_iterator_finalize(void *o
 pn_iterator_t *pn_iterator()
 {
   static const pn_class_t clazz = PN_CLASS(pn_iterator);
-  pn_iterator_t *it = (pn_iterator_t *) pn_new(sizeof(pn_iterator_t), &clazz);
+  pn_iterator_t *it = (pn_iterator_t *) pn_class_new(&clazz, sizeof(pn_iterator_t));
   return it;
 }
 

Modified: qpid/proton/trunk/proton-c/src/posix/driver.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/posix/driver.c?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/posix/driver.c (original)
+++ qpid/proton/trunk/proton-c/src/posix/driver.c Mon Sep 15 19:19:34 2014
@@ -342,12 +342,12 @@ void pn_connector_set_connection(pn_conn
 {
   if (!ctor) return;
   if (ctor->connection) {
-    pn_decref(ctor->connection);
+    pn_class_decref(PN_OBJECT, ctor->connection);
     pn_transport_unbind(ctor->transport);
   }
   ctor->connection = connection;
   if (ctor->connection) {
-    pn_incref(ctor->connection);
+    pn_class_incref(PN_OBJECT, ctor->connection);
     pn_transport_bind(ctor->transport, connection);
   }
   if (ctor->transport) pn_transport_trace(ctor->transport, ctor->trace);
@@ -404,7 +404,7 @@ void pn_connector_free(pn_connector_t *c
   if (ctor->driver) pn_driver_remove_connector(ctor->driver, ctor);
   pn_transport_free(ctor->transport);
   ctor->transport = NULL;
-  if (ctor->connection) pn_decref(ctor->connection);
+  if (ctor->connection) pn_class_decref(PN_OBJECT, ctor->connection);
   ctor->connection = NULL;
   free(ctor);
 }

Modified: qpid/proton/trunk/proton-c/src/posix/io.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/posix/io.c?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/posix/io.c (original)
+++ qpid/proton/trunk/proton-c/src/posix/io.c Mon Sep 15 19:19:34 2014
@@ -69,7 +69,7 @@ void pn_io_finalize(void *obj)
 pn_io_t *pn_io(void)
 {
   static const pn_class_t clazz = PN_CLASS(pn_io);
-  pn_io_t *io = (pn_io_t *) pn_new(sizeof(pn_io_t), &clazz);
+  pn_io_t *io = (pn_io_t *) pn_class_new(&clazz, sizeof(pn_io_t));
   return io;
 }
 

Modified: qpid/proton/trunk/proton-c/src/posix/selector.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/posix/selector.c?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/posix/selector.c (original)
+++ qpid/proton/trunk/proton-c/src/posix/selector.c Mon Sep 15 19:19:34 2014
@@ -45,7 +45,7 @@ void pn_selector_initialize(void *obj)
   selector->fds = NULL;
   selector->deadlines = NULL;
   selector->capacity = 0;
-  selector->selectables = pn_list(0, 0);
+  selector->selectables = pn_list(PN_OBJECT, 0, 0);
   selector->deadline = 0;
   selector->current = 0;
   selector->awoken = 0;
@@ -68,7 +68,7 @@ void pn_selector_finalize(void *obj)
 pn_selector_t *pni_selector(void)
 {
   static const pn_class_t clazz = PN_CLASS(pn_selector);
-  pn_selector_t *selector = (pn_selector_t *) pn_new(sizeof(pn_selector_t), &clazz);
+  pn_selector_t *selector = (pn_selector_t *) pn_class_new(&clazz, sizeof(pn_selector_t));
   return selector;
 }
 

Modified: qpid/proton/trunk/proton-c/src/selectable.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/selectable.c?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/selectable.c (original)
+++ qpid/proton/trunk/proton-c/src/selectable.c Mon Sep 15 19:19:34 2014
@@ -91,7 +91,7 @@ pn_selectable_t *pni_selectable(ssize_t 
                                 void (*finalize)(pn_selectable_t *))
 {
   static const pn_class_t clazz = PN_CLASS(pn_selectable);
-  pn_selectable_t *selectable = (pn_selectable_t *) pn_new(sizeof(pn_selectable_t), &clazz);
+  pn_selectable_t *selectable = (pn_selectable_t *) pn_class_new(&clazz, sizeof(pn_selectable_t));
   selectable->capacity = capacity;
   selectable->pending = pending;
   selectable->readable = readable;

Modified: qpid/proton/trunk/proton-c/src/tests/object.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/tests/object.c?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/tests/object.c (original)
+++ qpid/proton/trunk/proton-c/src/tests/object.c Mon Sep 15 19:19:34 2014
@@ -32,7 +32,7 @@ static void *END = &mem;
 
 static pn_list_t *build_list(size_t capacity, int options, ...)
 {
-  pn_list_t *result = pn_list(capacity, options);
+  pn_list_t *result = pn_list(PN_OBJECT, capacity, options);
   va_list ap;
 
   va_start(ap, options);
@@ -44,7 +44,7 @@ static pn_list_t *build_list(size_t capa
 
     pn_list_add(result, arg);
     if (PN_REFCOUNT & options) {
-      pn_decref(arg);
+      pn_class_decref(PN_OBJECT, arg);
     }
   }
   va_end(ap);
@@ -54,7 +54,7 @@ static pn_list_t *build_list(size_t capa
 
 static pn_map_t *build_map(size_t capacity, float load_factor, int options, ...)
 {
-  pn_map_t *result = pn_map(capacity, load_factor, options);
+  pn_map_t *result = pn_map(PN_OBJECT, PN_OBJECT, capacity, load_factor, options);
   va_list ap;
 
   void *prev = NULL;
@@ -71,8 +71,8 @@ static pn_map_t *build_map(size_t capaci
     if (count % 2) {
       pn_map_put(result, prev, arg);
       if (PN_REFCOUNT & options) {
-        pn_decref(prev);
-        pn_decref(arg);
+        pn_class_decref(PN_OBJECT, prev);
+        pn_class_decref(PN_OBJECT, arg);
       }
     } else {
       prev = arg;
@@ -93,8 +93,6 @@ static void noop(void *o) {}
 static uintptr_t zero(void *o) { return 0; }
 static intptr_t delta(void *a, void *b) { return (uintptr_t) b - (uintptr_t) a; }
 
-static pn_class_t null_class = {0};
-
 #define noop_initialize noop
 #define noop_finalize noop
 #define noop_hashcode zero
@@ -136,9 +134,9 @@ static void test_class(const pn_class_t 
 
 static void test_new(size_t size, const pn_class_t *clazz)
 {
-  void *obj = pn_new(size, clazz);
+  void *obj = pn_class_new(clazz, size);
   assert(obj);
-  assert(pn_refcount(obj) == 1);
+  assert(pn_class_refcount(PN_OBJECT, obj) == 1);
   assert(pn_class(obj) == clazz);
   char *bytes = (char *) obj;
   for (size_t i = 0; i < size; i++) {
@@ -164,7 +162,7 @@ static void test_finalize(void)
 {
   static pn_class_t clazz = PN_CLASS(finalizer);
 
-  int **obj = (int **) pn_new(sizeof(int **), &clazz);
+  int **obj = (int **) pn_class_new(&clazz, sizeof(int **));
   assert(obj);
 
   int called = 0;
@@ -191,7 +189,7 @@ static uintptr_t hashcode(void *obj) { r
 static void test_hashcode(void)
 {
   static pn_class_t clazz = PN_CLASS(hashcode);
-  void *obj = pn_new(0, &clazz);
+  void *obj = pn_class_new(&clazz, 0);
   assert(obj);
   assert(pn_hashcode(obj) == (uintptr_t) obj);
   assert(pn_hashcode(NULL) == 0);
@@ -208,9 +206,9 @@ static void test_compare(void)
 {
   static pn_class_t clazz = PN_CLASS(compare);
 
-  void *a = pn_new(0, &clazz);
+  void *a = pn_class_new(&clazz, 0);
   assert(a);
-  void *b = pn_new(0, &clazz);
+  void *b = pn_class_new(&clazz, 0);
   assert(b);
 
   assert(pn_compare(a, b));
@@ -236,7 +234,7 @@ static void test_compare(void)
 
 static void test_refcounting(int refs)
 {
-  void *obj = pn_new(0, PN_OBJECT);
+  void *obj = pn_class_new(PN_OBJECT, 0);
 
   assert(pn_refcount(obj) == 1);
 
@@ -259,7 +257,7 @@ static void test_refcounting(int refs)
 
 static void test_list(size_t capacity)
 {
-  pn_list_t *list = pn_list(0, 0);
+  pn_list_t *list = pn_list(PN_OBJECT, 0, 0);
   assert(pn_list_size(list) == 0);
   assert(!pn_list_add(list, (void *) 0));
   assert(!pn_list_add(list, (void *) 1));
@@ -279,12 +277,12 @@ static void test_list(size_t capacity)
 
 static void test_list_refcount(size_t capacity)
 {
-  void *one = pn_new(0, PN_OBJECT);
-  void *two = pn_new(0, PN_OBJECT);
-  void *three = pn_new(0, PN_OBJECT);
-  void *four = pn_new(0, PN_OBJECT);
+  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);
 
-  pn_list_t *list = pn_list(0, PN_REFCOUNT);
+  pn_list_t *list = pn_list(PN_OBJECT, 0, PN_REFCOUNT);
   assert(!pn_list_add(list, one));
   assert(!pn_list_add(list, two));
   assert(!pn_list_add(list, three));
@@ -336,7 +334,7 @@ static void check_list_index(pn_list_t *
 
 static void test_list_index(void)
 {
-  pn_list_t *l = pn_list(0, 0);
+  pn_list_t *l = pn_list(PN_OBJECT, 0, 0);
   void *one = pn_string("one");
   void *two = pn_string("two");
   void *three = pn_string("three");
@@ -450,11 +448,11 @@ static void test_build_map_odd(void)
 
 static void test_map(void)
 {
-  void *one = pn_new(0, PN_OBJECT);
-  void *two = pn_new(0, PN_OBJECT);
-  void *three = pn_new(0, PN_OBJECT);
+  void *one = pn_class_new(PN_OBJECT, 0);
+  void *two = pn_class_new(PN_OBJECT, 0);
+  void *three = pn_class_new(PN_OBJECT, 0);
 
-  pn_map_t *map = pn_map(4, 0.75, PN_REFCOUNT);
+  pn_map_t *map = pn_map(PN_OBJECT, PN_OBJECT, 4, 0.75, PN_REFCOUNT);
   assert(pn_map_size(map) == 0);
 
   pn_string_t *key = pn_string("key");
@@ -513,11 +511,11 @@ static void test_map(void)
 
 static void test_hash(void)
 {
-  void *one = pn_new(0, PN_OBJECT);
-  void *two = pn_new(0, PN_OBJECT);
-  void *three = pn_new(0, PN_OBJECT);
+  void *one = pn_class_new(PN_OBJECT, 0);
+  void *two = pn_class_new(PN_OBJECT, 0);
+  void *three = pn_class_new(PN_OBJECT, 0);
 
-  pn_hash_t *hash = pn_hash(4, 0.75, PN_REFCOUNT);
+  pn_hash_t *hash = pn_hash(PN_OBJECT, 4, 0.75, PN_REFCOUNT);
   pn_hash_put(hash, 0, NULL);
   pn_hash_put(hash, 1, one);
   pn_hash_put(hash, 2, two);
@@ -576,12 +574,12 @@ static void test_map_links(void)
   const pn_class_t collider_clazz = PN_CLASS(collider);
   void *keys[3];
   for (int i = 0; i < 3; i++)
-    keys[i] = pn_new(0, &collider_clazz);
+    keys[i] = pn_class_new(&collider_clazz, 0);
 
   // test deleting a head, middle link, tail
 
   for (int delete_idx=0; delete_idx < 3; delete_idx++) {
-    pn_map_t *map = pn_map(0, 0.75, 0);
+    pn_map_t *map = pn_map(PN_OBJECT, PN_OBJECT, 0, 0.75, 0);
     // create a chain of entries that have same head (from identical key hashcode)
     for (int i = 0; i < 3; i++) {
       pn_map_put(map, keys[i], keys[i]);
@@ -692,17 +690,17 @@ static void test_string_addf(void)
 
 static void test_map_iteration(int n)
 {
-  pn_list_t *pairs = pn_list(2*n, PN_REFCOUNT);
+  pn_list_t *pairs = pn_list(PN_OBJECT, 2*n, PN_REFCOUNT);
   for (int i = 0; i < n; i++) {
-    void *key = pn_new(0, PN_OBJECT);
-    void *value = pn_new(0, PN_OBJECT);
+    void *key = pn_class_new(PN_OBJECT, 0);
+    void *value = pn_class_new(PN_OBJECT, 0);
     pn_list_add(pairs, key);
     pn_list_add(pairs, value);
     pn_decref(key);
     pn_decref(value);
   }
 
-  pn_map_t *map = pn_map(0, 0.75, PN_REFCOUNT);
+  pn_map_t *map = pn_map(PN_OBJECT, PN_OBJECT, 0, 0.75, PN_REFCOUNT);
 
   assert(pn_map_head(map) == 0);
 
@@ -796,14 +794,14 @@ void test_map_inspect(void)
 
 void test_list_compare(void)
 {
-  pn_list_t *a = pn_list(0, PN_REFCOUNT);
-  pn_list_t *b = pn_list(0, PN_REFCOUNT);
+  pn_list_t *a = pn_list(PN_OBJECT, 0, PN_REFCOUNT);
+  pn_list_t *b = pn_list(PN_OBJECT, 0, PN_REFCOUNT);
 
   assert(pn_equals(a, b));
 
-  void *one = pn_new(0, PN_OBJECT);
-  void *two = pn_new(0, PN_OBJECT);
-  void *three = pn_new(0, PN_OBJECT);
+  void *one = pn_class_new(PN_OBJECT, 0);
+  void *two = pn_class_new(PN_OBJECT, 0);
+  void *three = pn_class_new(PN_OBJECT, 0);
 
   pn_list_add(a, one);
   assert(!pn_equals(a, b));
@@ -873,7 +871,6 @@ int main(int argc, char **argv)
 
   for (size_t i = 0; i < 128; i++) {
     test_new(i, PN_OBJECT);
-    test_new(i, &null_class);
     test_new(i, &noop_class);
   }
 

Modified: qpid/proton/trunk/proton-c/src/transport/transport.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/transport/transport.c?rev=1625121&r1=1625120&r2=1625121&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/transport/transport.c (original)
+++ qpid/proton/trunk/proton-c/src/transport/transport.c Mon Sep 15 19:19:34 2014
@@ -41,7 +41,7 @@ static ssize_t transport_consume(pn_tran
 
 void pn_delivery_map_init(pn_delivery_map_t *db, pn_sequence_t next)
 {
-  db->deliveries = pn_hash(0, 0.75, PN_REFCOUNT);
+  db->deliveries = pn_hash(PN_OBJECT, 0, 0.75, PN_REFCOUNT);
   db->next = next;
 }
 
@@ -163,8 +163,8 @@ static void pn_transport_initialize(void
   transport->disp_data = pn_data(0);
   pn_condition_init(&transport->remote_condition);
 
-  transport->local_channels = pn_hash(0, 0.75, PN_REFCOUNT);
-  transport->remote_channels = pn_hash(0, 0.75, PN_REFCOUNT);
+  transport->local_channels = pn_hash(PN_OBJECT, 0, 0.75, PN_REFCOUNT);
+  transport->remote_channels = pn_hash(PN_OBJECT, 0, 0.75, PN_REFCOUNT);
 
   transport->bytes_input = 0;
   transport->bytes_output = 0;
@@ -209,8 +209,8 @@ static void pn_transport_finalize(void *
 pn_transport_t *pn_transport()
 {
   static const pn_class_t clazz = PN_CLASS(pn_transport);
-  pn_transport_t *transport = (pn_transport_t *) pn_new(sizeof(pn_transport_t),
-                                                        &clazz);
+  pn_transport_t *transport =
+    (pn_transport_t *) pn_class_new(&clazz, sizeof(pn_transport_t));
   if (!transport) return NULL;
 
   transport->output_buf = (char *) malloc(transport->output_size);
@@ -266,7 +266,7 @@ int pn_transport_bind(pn_transport_t *tr
   if (connection->transport) return PN_STATE_ERR;
   transport->connection = connection;
   connection->transport = transport;
-  pn_incref2(connection, transport);
+  pn_incref(connection);
   if (transport->open_rcvd) {
     PN_SET_REMOTE(connection->endpoint.state, PN_REMOTE_ACTIVE);
     pn_collector_put(connection->collector, PN_CONNECTION_REMOTE_OPEN, connection);
@@ -322,7 +322,7 @@ int pn_transport_unbind(pn_transport_t *
   pni_transport_unbind_channels(transport->remote_channels);
 
   pn_connection_unbound(conn);
-  pn_decref2(conn, transport);
+  pn_decref(conn);
   return 0;
 }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org