This is an automated email from the ASF dual-hosted git repository. astitcher pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/qpid-proton.git
commit f2693f29d1226b224477c3eab62654c49499ec6b Author: Andrew Stitcher <astitc...@apache.org> AuthorDate: Tue May 9 16:24:29 2023 -0400 PROTON-2751: Don't use pn_buffer for delivery tag --- c/src/core/engine-internal.h | 2 +- c/src/core/engine.c | 19 +++++++++---------- c/src/core/transport.c | 9 ++++----- c/src/core/util.h | 14 ++++++++++++++ 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/c/src/core/engine-internal.h b/c/src/core/engine-internal.h index 4cf6ea502..69f8a8293 100644 --- a/c/src/core/engine-internal.h +++ b/c/src/core/engine-internal.h @@ -330,8 +330,8 @@ struct pn_disposition_t { struct pn_delivery_t { pn_disposition_t local; pn_disposition_t remote; + pn_delivery_tag_t tag; pn_link_t *link; // reference counted - pn_buffer_t *tag; pn_delivery_t *unsettled_next; pn_delivery_t *unsettled_prev; pn_delivery_t *work_next; diff --git a/c/src/core/engine.c b/c/src/core/engine.c index 70138566d..02c41299b 100644 --- a/c/src/core/engine.c +++ b/c/src/core/engine.c @@ -1471,7 +1471,8 @@ static void pn_delivery_finalize(void *object) ? &link->session->state.outgoing : &link->session->state.incoming, delivery); - pn_buffer_clear(delivery->tag); + pn_bytes_free(delivery->tag); + delivery->tag = (pn_delivery_tag_t){0, NULL}; pn_buffer_clear(delivery->bytes); pn_record_clear(delivery->context); delivery->settled = true; @@ -1488,7 +1489,8 @@ static void pn_delivery_finalize(void *object) if (!pooled) { pn_free(delivery->context); - pn_buffer_free(delivery->tag); + pn_bytes_free(delivery->tag); + delivery->tag = (pn_delivery_tag_t){0, NULL}; pn_buffer_free(delivery->bytes); pn_disposition_finalize(&delivery->local); pn_disposition_finalize(&delivery->remote); @@ -1522,7 +1524,7 @@ static void pn_disposition_clear(pn_disposition_t *ds) void pn_delivery_inspect(void *obj, pn_fixed_string_t *dst) { pn_delivery_t *d = (pn_delivery_t*)obj; const char* dir = pn_link_is_sender(d->link) ? "sending" : "receiving"; - pn_bytes_t bytes = pn_buffer_bytes(d->tag); + pn_bytes_t bytes = d->tag; pn_fixed_string_addf(dst, "pn_delivery<%p>{%s, tag=b\"", obj, dir); pn_fixed_string_quote(dst, bytes.start, bytes.size); pn_fixed_string_addf(dst, "\", local=%s, remote=%s}", @@ -1544,7 +1546,6 @@ pn_delivery_t *pn_delivery(pn_link_t *link, pn_delivery_tag_t tag) if (!delivery) { delivery = (pn_delivery_t *) pn_class_new(&PN_CLASSCLASS(pn_delivery), sizeof(pn_delivery_t)); if (!delivery) return NULL; - delivery->tag = pn_buffer(16); delivery->bytes = pn_buffer(64); pn_disposition_init(&delivery->local); pn_disposition_init(&delivery->remote); @@ -1554,8 +1555,7 @@ pn_delivery_t *pn_delivery(pn_link_t *link, pn_delivery_tag_t tag) } delivery->link = link; pn_incref(delivery->link); // keep link until finalized - pn_buffer_clear(delivery->tag); - pn_buffer_append(delivery->tag, tag.start, tag.size); + delivery->tag = pn_bytes_dup(tag); pn_disposition_clear(&delivery->local); pn_disposition_clear(&delivery->remote); delivery->updated = false; @@ -1640,7 +1640,7 @@ bool pn_delivery_current(pn_delivery_t *delivery) void pn_delivery_dump(pn_delivery_t *d) { char tag[1024]; - pn_bytes_t bytes = pn_buffer_bytes(d->tag); + pn_bytes_t bytes = d->tag; pn_quote_data(tag, 1024, bytes.start, bytes.size); printf("{tag=%s, local.type=%" PRIu64 ", remote.type=%" PRIu64 ", local.settled=%u, " "remote.settled=%u, updated=%u, current=%u, writable=%u, readable=%u, " @@ -1743,10 +1743,9 @@ pn_condition_t *pn_disposition_condition(pn_disposition_t *disposition) pn_delivery_tag_t pn_delivery_tag(pn_delivery_t *delivery) { if (delivery) { - pn_bytes_t tag = pn_buffer_bytes(delivery->tag); - return pn_dtag(tag.start, tag.size); + return delivery->tag; } else { - return pn_dtag(0, 0); + return (pn_delivery_tag_t){0, NULL}; } } diff --git a/c/src/core/transport.c b/c/src/core/transport.c index e414789e5..8e3fe2373 100644 --- a/c/src/core/transport.c +++ b/c/src/core/transport.c @@ -883,7 +883,7 @@ static int pni_post_amqp_transfer_frame(pn_transport_t *transport, uint16_t ch, uint32_t handle, pn_sequence_t id, pn_bytes_t *full_payload, - const pn_bytes_t *tag, + const pn_bytes_t tag, uint32_t message_format, bool settled, bool more, @@ -904,7 +904,7 @@ static int pni_post_amqp_transfer_frame(pn_transport_t *transport, uint16_t ch, pn_amqp_encode_DLEIIzIQoQonQDLCQoQoQoe(&transport->scratch_space, TRANSFER, handle, id, - tag->size, tag->start, + tag.size, tag.start, message_format, settled, settled, more_flag, more_flag, @@ -916,7 +916,7 @@ static int pni_post_amqp_transfer_frame(pn_transport_t *transport, uint16_t ch, return PN_ERR; } - // At this point the side affect of the fill is to encode the performative into transport->frame + // At this point the side affect of the fill is to encode the performative into transport->scratch_space do { // send as many frames as possible without changing the 'more' flag... @@ -2222,13 +2222,12 @@ static int pni_process_tpwork_sender(pn_transport_t *transport, pn_delivery_t *d pn_bytes_t bytes = pn_buffer_bytes(delivery->bytes); size_t full_size = bytes.size; - pn_bytes_t tag = pn_buffer_bytes(delivery->tag); pn_data_clear(transport->disp_data); PN_RETURN_IF_ERROR(pni_disposition_encode(&delivery->local, transport->disp_data)); int count = pni_post_amqp_transfer_frame(transport, ssn_state->local_channel, link_state->local_handle, - state->id, &bytes, &tag, + state->id, &bytes, delivery->tag, 0, // message-format delivery->local.settled, !delivery->done, diff --git a/c/src/core/util.h b/c/src/core/util.h index 7ed5b925f..ceb70720f 100644 --- a/c/src/core/util.h +++ b/c/src/core/util.h @@ -55,6 +55,20 @@ static inline pn_bytes_t pn_string_bytes(struct pn_string_t *s) { return pn_bytes(pn_string_size(s), pn_string_get(s)); } +static inline pn_bytes_t pn_bytes_dup(pn_bytes_t in) { + if (in.size) { + char* rbytes = malloc(in.size); + memcpy(rbytes, in.start, in.size); + return (pn_bytes_t){in.size, rbytes}; + } else { + return (pn_bytes_t){0, NULL}; + } +} + +static inline void pn_bytes_free(pn_bytes_t in) { + free((void*)in.start); +} + static inline pn_rwbytes_t pn_rwbytes_alloc(size_t size) { char* space = malloc(size); size_t s = space ? size : 0; --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org