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

Reply via email to