This is an automated email from the ASF dual-hosted git repository.

gsim pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git

commit 14ab66747eecc6a1aea80969ec058a686c2961c6
Author: Chuck Rolke <c...@apache.org>
AuthorDate: Wed May 19 15:21:26 2021 -0400

    DISPATCH-2142: Improvements for tcp buffering
    
    * Allow little buffer copy that completely fills big buffer.
    * Preserve stream_data object while there is still data to be copied
      from its buffers. Prevents stream_data free that in turn frees
      message qd_buffers that still need to be copied.
---
 src/adaptors/tcp_adaptor.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/adaptors/tcp_adaptor.c b/src/adaptors/tcp_adaptor.c
index 1f8a87c..b003732 100644
--- a/src/adaptors/tcp_adaptor.c
+++ b/src/adaptors/tcp_adaptor.c
@@ -565,18 +565,22 @@ static bool copy_outgoing_buffs(qdr_tcp_connection_t 
*conn)
     } else {
         //copy small buffers into large one
         size_t used = conn->outgoing_buff_idx;
-        while (used < conn->outgoing_buff_count && ((conn->write_buffer.size + 
conn->outgoing_buffs[used].size) < conn->write_buffer.capacity)) {
+        while (used < conn->outgoing_buff_count && ((conn->write_buffer.size + 
conn->outgoing_buffs[used].size) <= conn->write_buffer.capacity)) {
             memcpy(conn->write_buffer.bytes + conn->write_buffer.size, 
conn->outgoing_buffs[used].bytes, conn->outgoing_buffs[used].size);
             conn->write_buffer.size += conn->outgoing_buffs[used].size;
             qd_log(tcp_adaptor->log_source, QD_LOG_DEBUG,
                    "[C%"PRIu64"] Copying buffer %i of %i with %i bytes 
(total=%i)", conn->conn_id, used+1, conn->outgoing_buff_count - 
conn->outgoing_buff_idx, conn->outgoing_buffs[used].size, 
conn->write_buffer.size);
             used++;
         }
-        conn->write_buffer.context = (uintptr_t) conn->previous_stream_data;
-        conn->previous_stream_data = 0;
 
         result = used == conn->outgoing_buff_count;
 
+        if (result) {
+            // set context only when stream data has just been consumed
+            conn->write_buffer.context = (uintptr_t) 
conn->previous_stream_data;
+            conn->previous_stream_data = 0;
+        }
+
         conn->outgoing_buff_idx   += used;
         qd_log(tcp_adaptor->log_source, QD_LOG_DEBUG,
                "[C%"PRIu64"] Copied %i buffers, %i remain", conn->conn_id, 
used, conn->outgoing_buff_count - conn->outgoing_buff_idx);

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

Reply via email to