Author: gsim Date: Fri Oct 10 12:50:03 2014 New Revision: 1630813 URL: http://svn.apache.org/r1630813 Log: made list and map take classes
Modified: qpid/proton/branches/examples/proton-c/include/proton/object.h qpid/proton/branches/examples/proton-c/src/codec/codec.c qpid/proton/branches/examples/proton-c/src/codec/decoder.c qpid/proton/branches/examples/proton-c/src/codec/encoder.c qpid/proton/branches/examples/proton-c/src/engine/engine.c qpid/proton/branches/examples/proton-c/src/events/event.c qpid/proton/branches/examples/proton-c/src/message/message.c qpid/proton/branches/examples/proton-c/src/messenger/messenger.c qpid/proton/branches/examples/proton-c/src/messenger/store.c qpid/proton/branches/examples/proton-c/src/messenger/subscription.c qpid/proton/branches/examples/proton-c/src/messenger/transform.c qpid/proton/branches/examples/proton-c/src/object/object.c qpid/proton/branches/examples/proton-c/src/posix/driver.c qpid/proton/branches/examples/proton-c/src/posix/io.c qpid/proton/branches/examples/proton-c/src/posix/selector.c qpid/proton/branches/examples/proton-c/src/selectable.c qpid/proton/branches/examples/proton-c/src/tests/object.c qpid/proton/branches/examples/proton-c/src/transport/transport.c Modified: qpid/proton/branches/examples/proton-c/include/proton/object.h URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/include/proton/object.h?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/include/proton/object.h (original) +++ qpid/proton/branches/examples/proton-c/include/proton/object.h Fri Oct 10 12:50:03 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/branches/examples/proton-c/src/codec/codec.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/codec/codec.c?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/codec/codec.c (original) +++ qpid/proton/branches/examples/proton-c/src/codec/codec.c Fri Oct 10 12:50:03 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/branches/examples/proton-c/src/codec/decoder.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/codec/decoder.c?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/codec/decoder.c (original) +++ qpid/proton/branches/examples/proton-c/src/codec/decoder.c Fri Oct 10 12:50:03 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/branches/examples/proton-c/src/codec/encoder.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/codec/encoder.c?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/codec/encoder.c (original) +++ qpid/proton/branches/examples/proton-c/src/codec/encoder.c Fri Oct 10 12:50:03 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/branches/examples/proton-c/src/engine/engine.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/engine/engine.c?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/engine/engine.c (original) +++ qpid/proton/branches/examples/proton-c/src/engine/engine.c Fri Oct 10 12:50:03 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); @@ -825,7 +825,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 @@ -836,11 +836,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); @@ -1089,7 +1089,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) @@ -1124,10 +1124,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/branches/examples/proton-c/src/events/event.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/events/event.c?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/events/event.c (original) +++ qpid/proton/branches/examples/proton-c/src/events/event.c Fri Oct 10 12:50:03 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/branches/examples/proton-c/src/message/message.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/message/message.c?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/message/message.c (original) +++ qpid/proton/branches/examples/proton-c/src/message/message.c Fri Oct 10 12:50:03 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/branches/examples/proton-c/src/messenger/messenger.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/messenger/messenger.c?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/messenger/messenger.c (original) +++ qpid/proton/branches/examples/proton-c/src/messenger/messenger.c Fri Oct 10 12:50:03 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/branches/examples/proton-c/src/messenger/store.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/messenger/store.c?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/messenger/store.c (original) +++ qpid/proton/branches/examples/proton-c/src/messenger/store.c Fri Oct 10 12:50:03 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/branches/examples/proton-c/src/messenger/subscription.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/messenger/subscription.c?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/messenger/subscription.c (original) +++ qpid/proton/branches/examples/proton-c/src/messenger/subscription.c Fri Oct 10 12:50:03 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/branches/examples/proton-c/src/messenger/transform.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/messenger/transform.c?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/messenger/transform.c (original) +++ qpid/proton/branches/examples/proton-c/src/messenger/transform.c Fri Oct 10 12:50:03 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/branches/examples/proton-c/src/object/object.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/object/object.c?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/object/object.c (original) +++ qpid/proton/branches/examples/proton-c/src/object/object.c Fri Oct 10 12:50:03 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/branches/examples/proton-c/src/posix/driver.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/posix/driver.c?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/posix/driver.c (original) +++ qpid/proton/branches/examples/proton-c/src/posix/driver.c Fri Oct 10 12:50:03 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/branches/examples/proton-c/src/posix/io.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/posix/io.c?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/posix/io.c (original) +++ qpid/proton/branches/examples/proton-c/src/posix/io.c Fri Oct 10 12:50:03 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/branches/examples/proton-c/src/posix/selector.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/posix/selector.c?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/posix/selector.c (original) +++ qpid/proton/branches/examples/proton-c/src/posix/selector.c Fri Oct 10 12:50:03 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/branches/examples/proton-c/src/selectable.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/selectable.c?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/selectable.c (original) +++ qpid/proton/branches/examples/proton-c/src/selectable.c Fri Oct 10 12:50:03 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/branches/examples/proton-c/src/tests/object.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/tests/object.c?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/tests/object.c (original) +++ qpid/proton/branches/examples/proton-c/src/tests/object.c Fri Oct 10 12:50:03 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/branches/examples/proton-c/src/transport/transport.c URL: http://svn.apache.org/viewvc/qpid/proton/branches/examples/proton-c/src/transport/transport.c?rev=1630813&r1=1630812&r2=1630813&view=diff ============================================================================== --- qpid/proton/branches/examples/proton-c/src/transport/transport.c (original) +++ qpid/proton/branches/examples/proton-c/src/transport/transport.c Fri Oct 10 12:50:03 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; } @@ -164,8 +164,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; @@ -210,8 +210,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); @@ -267,7 +267,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); @@ -326,7 +326,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-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org