use records to provide more flexible contexts
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/fb3ecd4f Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/fb3ecd4f Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/fb3ecd4f Branch: refs/heads/master Commit: fb3ecd4fb7dc49e963a62f6d7fe5b3bf2a41b65a Parents: 901e147 Author: Rafael Schloming <[email protected]> Authored: Sun Nov 23 05:22:55 2014 -0500 Committer: Rafael Schloming <[email protected]> Committed: Thu Nov 27 06:14:50 2014 -0500 ---------------------------------------------------------------------- proton-c/include/proton/connection.h | 10 +++++ proton-c/include/proton/delivery.h | 10 +++++ proton-c/include/proton/link.h | 10 +++++ proton-c/include/proton/session.h | 10 +++++ proton-c/include/proton/transport.h | 9 +++++ proton-c/src/engine/engine-internal.h | 10 ++--- proton-c/src/engine/engine.c | 65 ++++++++++++++++++++++-------- proton-c/src/transport/transport.c | 10 ++++- 8 files changed, 112 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/fb3ecd4f/proton-c/include/proton/connection.h ---------------------------------------------------------------------- diff --git a/proton-c/include/proton/connection.h b/proton-c/include/proton/connection.h index e476689..b7e525c 100644 --- a/proton-c/include/proton/connection.h +++ b/proton-c/include/proton/connection.h @@ -138,6 +138,7 @@ PN_EXTERN pn_error_t *pn_connection_error(pn_connection_t *connection); PN_EXTERN void pn_connection_collect(pn_connection_t *connection, pn_collector_t *collector); /** + * @deprecated * Get the application context that is associated with a connection * object. * @@ -150,6 +151,7 @@ PN_EXTERN void pn_connection_collect(pn_connection_t *connection, pn_collector_t PN_EXTERN void *pn_connection_get_context(pn_connection_t *connection); /** + * @deprecated * Set a new application context for a connection object. * * The application context for a connection object may be retrieved @@ -161,6 +163,14 @@ PN_EXTERN void *pn_connection_get_context(pn_connection_t *connection); PN_EXTERN void pn_connection_set_context(pn_connection_t *connection, void *context); /** + * Get the attachments that are associated with a connection object. + * + * @param[in] connection the connection whose attachments are to be returned. + * @return the attachments for the connection object + */ +PN_EXTERN pn_record_t *pn_connection_attachments(pn_connection_t *connection); + +/** * Get the endpoint state flags for a connection. * * @param[in] connection the connection http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/fb3ecd4f/proton-c/include/proton/delivery.h ---------------------------------------------------------------------- diff --git a/proton-c/include/proton/delivery.h b/proton-c/include/proton/delivery.h index 527eaed..be75653 100644 --- a/proton-c/include/proton/delivery.h +++ b/proton-c/include/proton/delivery.h @@ -78,6 +78,7 @@ static inline pn_delivery_tag_t pn_dtag(const char *bytes, size_t size) { PN_EXTERN pn_delivery_t *pn_delivery(pn_link_t *link, pn_delivery_tag_t tag); /** + * @deprecated * Get the application context that is associated with a delivery object. * * The application context for a delivery may be set using @@ -89,6 +90,7 @@ PN_EXTERN pn_delivery_t *pn_delivery(pn_link_t *link, pn_delivery_tag_t tag); PN_EXTERN void *pn_delivery_get_context(pn_delivery_t *delivery); /** + * @deprecated * Set a new application context for a delivery object. * * The application context for a delivery object may be retrieved using @@ -100,6 +102,14 @@ PN_EXTERN void *pn_delivery_get_context(pn_delivery_t *delivery); PN_EXTERN void pn_delivery_set_context(pn_delivery_t *delivery, void *context); /** + * Get the attachments that are associated with a delivery object. + * + * @param[in] delivery the delivery whose attachments are to be returned. + * @return the attachments for the delivery object + */ +PN_EXTERN pn_record_t *pn_delivery_attachments(pn_delivery_t *delivery); + +/** * Get the tag for a delivery object. * * @param[in] delivery a delivery object http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/fb3ecd4f/proton-c/include/proton/link.h ---------------------------------------------------------------------- diff --git a/proton-c/include/proton/link.h b/proton-c/include/proton/link.h index b2fa4b9..863fe16 100644 --- a/proton-c/include/proton/link.h +++ b/proton-c/include/proton/link.h @@ -80,6 +80,7 @@ PN_EXTERN pn_link_t *pn_receiver(pn_session_t *session, const char *name); PN_EXTERN void pn_link_free(pn_link_t *link); /** + * @deprecated * Get the application context that is associated with a link object. * * The application context for a link may be set using @@ -91,6 +92,7 @@ PN_EXTERN void pn_link_free(pn_link_t *link); PN_EXTERN void *pn_link_get_context(pn_link_t *link); /** + * @deprecated * Set a new application context for a link object. * * The application context for a link object may be retrieved using @@ -102,6 +104,14 @@ PN_EXTERN void *pn_link_get_context(pn_link_t *link); PN_EXTERN void pn_link_set_context(pn_link_t *link, void *context); /** + * Get the attachments that are associated with a link object. + * + * @param[in] link the link whose attachments are to be returned. + * @return the attachments for the link object + */ +PN_EXTERN pn_record_t *pn_link_attachments(pn_link_t *link); + +/** * Get the name of a link. * * @param[in] link a link object http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/fb3ecd4f/proton-c/include/proton/session.h ---------------------------------------------------------------------- diff --git a/proton-c/include/proton/session.h b/proton-c/include/proton/session.h index 678b141..8b6e9fa 100644 --- a/proton-c/include/proton/session.h +++ b/proton-c/include/proton/session.h @@ -62,6 +62,7 @@ PN_EXTERN pn_session_t *pn_session(pn_connection_t *connection); PN_EXTERN void pn_session_free(pn_session_t *session); /** + * @deprecated * Get the application context that is associated with a session * object. * @@ -74,6 +75,7 @@ PN_EXTERN void pn_session_free(pn_session_t *session); PN_EXTERN void *pn_session_get_context(pn_session_t *session); /** + * @deprecated * Set a new application context for a session object. * * The application context for a session object may be retrieved @@ -85,6 +87,14 @@ PN_EXTERN void *pn_session_get_context(pn_session_t *session); PN_EXTERN void pn_session_set_context(pn_session_t *session, void *context); /** + * Get the attachments that are associated with a session object. + * + * @param[in] session the session whose attachments are to be returned. + * @return the attachments for the session object + */ +PN_EXTERN pn_record_t *pn_session_attachments(pn_session_t *session); + +/** * Get the endpoint state flags for a session. * * @param[in] session the session http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/fb3ecd4f/proton-c/include/proton/transport.h ---------------------------------------------------------------------- diff --git a/proton-c/include/proton/transport.h b/proton-c/include/proton/transport.h index 537e27d..690952b 100644 --- a/proton-c/include/proton/transport.h +++ b/proton-c/include/proton/transport.h @@ -197,6 +197,7 @@ PN_EXTERN pn_tracer_t pn_transport_get_tracer(pn_transport_t *transport); PN_EXTERN void *pn_transport_get_context(pn_transport_t *transport); /** + * @deprecated * Set a new application context for a transport object. * * The application context for a transport object may be retrieved using @@ -208,6 +209,14 @@ PN_EXTERN void *pn_transport_get_context(pn_transport_t *transport); PN_EXTERN void pn_transport_set_context(pn_transport_t *transport, void *context); /** + * Get the attachments that are associated with a transport object. + * + * @param[in] transport the transport whose attachments are to be returned. + * @return the attachments for the transport object + */ +PN_EXTERN pn_record_t *pn_transport_attachments(pn_transport_t *transport); + +/** * Log a message using a transport's logging mechanism. * * This can be useful in a debugging context as the log message will http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/fb3ecd4f/proton-c/src/engine/engine-internal.h ---------------------------------------------------------------------- diff --git a/proton-c/src/engine/engine-internal.h b/proton-c/src/engine/engine-internal.h index f53e88b..fbeb79b 100644 --- a/proton-c/src/engine/engine-internal.h +++ b/proton-c/src/engine/engine-internal.h @@ -160,7 +160,7 @@ struct pn_transport_t { size_t output_pending; char *output_buf; - void *context; + pn_record_t *context; /* input from peer */ size_t input_size; @@ -198,15 +198,15 @@ struct pn_connection_t { pn_data_t *offered_capabilities; pn_data_t *desired_capabilities; pn_data_t *properties; - void *context; pn_collector_t *collector; + pn_record_t *context; }; struct pn_session_t { pn_endpoint_t endpoint; pn_connection_t *connection; // reference counted pn_list_t *links; - void *context; + pn_record_t *context; size_t incoming_capacity; pn_sequence_t incoming_bytes; pn_sequence_t outgoing_bytes; @@ -243,7 +243,7 @@ struct pn_link_t { pn_delivery_t *current; pn_delivery_t *settled_head; pn_delivery_t *settled_tail; - void *context; + pn_record_t *context; size_t unsettled_count; pn_sequence_t available; pn_sequence_t credit; @@ -285,7 +285,7 @@ struct pn_delivery_t { pn_delivery_t *tpwork_prev; pn_delivery_state_t state; pn_buffer_t *bytes; - void *context; + pn_record_t *context; bool updated; bool settled; // tracks whether we're in the unsettled list or not bool work; http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/fb3ecd4f/proton-c/src/engine/engine.c ---------------------------------------------------------------------- diff --git a/proton-c/src/engine/engine.c b/proton-c/src/engine/engine.c index 1855f55..79da48c 100644 --- a/proton-c/src/engine/engine.c +++ b/proton-c/src/engine/engine.c @@ -152,15 +152,23 @@ void pn_connection_unbound(pn_connection_t *connection) } } +pn_record_t *pn_connection_attachments(pn_connection_t *connection) +{ + assert(connection); + return connection->context; +} + void *pn_connection_get_context(pn_connection_t *conn) { - return conn ? conn->context : 0; + // XXX: we should really assert on conn here, but this causes + // messenger tests to fail + return conn ? pn_record_get(conn->context, PN_LEGCTX) : NULL; } void pn_connection_set_context(pn_connection_t *conn, void *context) { - if (conn) - conn->context = context; + assert(conn); + pn_record_set(conn->context, PN_LEGCTX, context); } pn_transport_t *pn_connection_transport(pn_connection_t *connection) @@ -227,15 +235,21 @@ void pn_session_free(pn_session_t *session) pn_decref(session); } +pn_record_t *pn_session_attachments(pn_session_t *session) +{ + assert(session); + return session->context; +} + void *pn_session_get_context(pn_session_t *session) { - return session ? session->context : 0; + return session ? pn_record_get(session->context, PN_LEGCTX) : 0; } void pn_session_set_context(pn_session_t *session, void *context) { - if (session) - session->context = context; + assert(context); + pn_record_set(session->context, PN_LEGCTX, context); } @@ -303,13 +317,20 @@ void pn_link_free(pn_link_t *link) void *pn_link_get_context(pn_link_t *link) { - return link ? link->context : 0; + assert(link); + return pn_record_get(link->context, PN_LEGCTX); } void pn_link_set_context(pn_link_t *link, void *context) { - if (link) - link->context = context; + assert(link); + pn_record_set(link->context, PN_LEGCTX, context); +} + +pn_record_t *pn_link_attachments(pn_link_t *link) +{ + assert(link); + return link->context; } void pn_endpoint_init(pn_endpoint_t *endpoint, int type, pn_connection_t *conn) @@ -359,6 +380,7 @@ static void pn_connection_finalize(void *object) return; } + pn_free(conn->context); pn_decref(conn->collector); pn_free(conn->sessions); pn_free(conn->container); @@ -374,13 +396,12 @@ static void pn_connection_finalize(void *object) #define pn_connection_compare NULL #define pn_connection_inspect NULL -pn_connection_t *pn_connection() +pn_connection_t *pn_connection(void) { static const pn_class_t clazz = PN_CLASS(pn_connection); pn_connection_t *conn = (pn_connection_t *) pn_class_new(&clazz, sizeof(pn_connection_t)); if (!conn) return NULL; - conn->context = NULL; conn->endpoint_head = NULL; conn->endpoint_tail = NULL; pn_endpoint_init(&conn->endpoint, CONNECTION, conn); @@ -398,6 +419,7 @@ pn_connection_t *pn_connection() conn->desired_capabilities = pn_data(0); conn->properties = pn_data(0); conn->collector = NULL; + conn->context = pn_record(); return conn; } @@ -707,6 +729,7 @@ static void pn_session_finalize(void *object) return; } + pn_free(session->context); pn_free(session->links); pn_endpoint_tini(endpoint); pn_delivery_map_free(&session->state.incoming); @@ -731,7 +754,7 @@ pn_session_t *pn_session(pn_connection_t *conn) pn_endpoint_init(&ssn->endpoint, SESSION, conn); pn_add_session(conn, ssn); ssn->links = pn_list(PN_WEAKREF, 0); - ssn->context = 0; + ssn->context = pn_record(); ssn->incoming_capacity = 1024*1024; ssn->incoming_bytes = 0; ssn->outgoing_bytes = 0; @@ -826,6 +849,7 @@ static void pn_link_finalize(void *object) return; } + pn_free(link->context); pn_terminus_free(&link->source); pn_terminus_free(&link->target); pn_terminus_free(&link->remote_source); @@ -862,7 +886,7 @@ pn_link_t *pn_link_new(int type, pn_session_t *session, const char *name) link->drain = false; link->drain_flag_mode = true; link->drained = 0; - link->context = 0; + link->context = pn_record(); link->snd_settle_mode = PN_SND_MIXED; link->rcv_settle_mode = PN_RCV_FIRST; link->remote_snd_settle_mode = PN_SND_MIXED; @@ -1092,6 +1116,7 @@ static void pn_delivery_finalize(void *object) pn_delivery_t *delivery = (pn_delivery_t *) object; assert(delivery->settled); assert(!delivery->state.init); // no longer in session delivery map + pn_free(delivery->context); pn_buffer_free(delivery->tag); pn_buffer_free(delivery->bytes); pn_disposition_finalize(&delivery->local); @@ -1139,6 +1164,7 @@ pn_delivery_t *pn_delivery(pn_link_t *link, pn_delivery_tag_t tag) delivery->bytes = pn_buffer(64); pn_disposition_init(&delivery->local); pn_disposition_init(&delivery->remote); + delivery->context = pn_record(); } else { assert(!delivery->tpwork); } @@ -1157,7 +1183,7 @@ pn_delivery_t *pn_delivery(pn_link_t *link, pn_delivery_tag_t tag) delivery->tpwork = false; pn_buffer_clear(delivery->bytes); delivery->done = false; - delivery->context = NULL; + pn_record_clear(delivery->context); // begin delivery state delivery->state.init = false; @@ -1235,13 +1261,19 @@ void pn_delivery_dump(pn_delivery_t *d) void *pn_delivery_get_context(pn_delivery_t *delivery) { assert(delivery); - return delivery->context; + return pn_record_get(delivery->context, PN_LEGCTX); } void pn_delivery_set_context(pn_delivery_t *delivery, void *context) { assert(delivery); - delivery->context = context; + pn_record_set(delivery->context, PN_LEGCTX, context); +} + +pn_record_t *pn_delivery_attachments(pn_delivery_t *delivery) +{ + assert(delivery); + return delivery->context; } uint64_t pn_disposition_type(pn_disposition_t *disposition) @@ -1448,6 +1480,7 @@ void pn_real_settle(pn_delivery_t *delivery) delivery); pn_buffer_clear(delivery->tag); pn_buffer_clear(delivery->bytes); + pn_record_clear(delivery->context); delivery->settled = true; if (link->endpoint.freed) { pn_decref(delivery); http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/fb3ecd4f/proton-c/src/transport/transport.c ---------------------------------------------------------------------- diff --git a/proton-c/src/transport/transport.c b/proton-c/src/transport/transport.c index 67fd3ab..08072fe 100644 --- a/proton-c/src/transport/transport.c +++ b/proton-c/src/transport/transport.c @@ -309,6 +309,7 @@ static void pn_transport_initialize(void *object) transport->scratch = pn_string(NULL); transport->disp = pn_dispatcher(0, transport); transport->connection = NULL; + transport->context = pn_record(); for (int layer=0; layer<PN_IO_LAYER_CT; ++layer) { transport->io_layers[layer] = NULL; @@ -431,6 +432,7 @@ static void pn_transport_finalize(void *object) { pn_transport_t *transport = (pn_transport_t *) object; + pn_free(transport->context); pn_ssl_free(transport); pn_sasl_free(transport); pn_dispatcher_free(transport->disp); @@ -2134,12 +2136,18 @@ pn_tracer_t pn_transport_get_tracer(pn_transport_t *transport) void pn_transport_set_context(pn_transport_t *transport, void *context) { assert(transport); - transport->context = context; + pn_record_set(transport->context, PN_LEGCTX, context); } void *pn_transport_get_context(pn_transport_t *transport) { assert(transport); + return pn_record_get(transport->context, PN_LEGCTX); +} + +pn_record_t *pn_transport_attachments(pn_transport_t *transport) +{ + assert(transport); return transport->context; } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
