gfe-relnote: Construct QuicMemSliceSpans from a QuicMemSlices without copies. QuartcSession uses this functionality to send queued message frames without copying the data backed by QuicMemSlices in its queue. Note that this extends the platform/api by adding a new constructor to QuicMemSliceSpan. It adds a corresponding constructor to QuicMemSliceSpanImpl, so this will need to be merged into chromium manually. The changes required should be minimal (<10 lines of code). Not flag-protected, since the only changes are (a) platform/ code that is not called anywhere except quartc/ and (b) quartc/ code that is not called in GFE. PiperOrigin-RevId: 247689071 Change-Id: Ifbfbb52294b41da45a230ab63f8f199754b68211
diff --git a/quic/platform/api/quic_mem_slice.h b/quic/platform/api/quic_mem_slice.h index bcc7123..a40d638 100644 --- a/quic/platform/api/quic_mem_slice.h +++ b/quic/platform/api/quic_mem_slice.h
@@ -60,6 +60,8 @@ bool empty() const { return impl_.empty(); } + QuicMemSliceImpl* impl() { return &impl_; } + private: QuicMemSliceImpl impl_; };
diff --git a/quic/platform/api/quic_mem_slice_span.h b/quic/platform/api/quic_mem_slice_span.h index 4fdf059..62cec48 100644 --- a/quic/platform/api/quic_mem_slice_span.h +++ b/quic/platform/api/quic_mem_slice_span.h
@@ -22,6 +22,9 @@ public: explicit QuicMemSliceSpan(QuicMemSliceSpanImpl impl) : impl_(impl) {} + // Constructs a span with a single QuicMemSlice. + explicit QuicMemSliceSpan(QuicMemSlice* slice) : impl_(slice->impl()) {} + QuicMemSliceSpan(const QuicMemSliceSpan& other) = default; QuicMemSliceSpan& operator=(const QuicMemSliceSpan& other) = default; QuicMemSliceSpan(QuicMemSliceSpan&& other) = default;
diff --git a/quic/quartc/quartc_session.cc b/quic/quartc/quartc_session.cc index 59bb2c2..a62fc10 100644 --- a/quic/quartc/quartc_session.cc +++ b/quic/quartc/quartc_session.cc
@@ -70,14 +70,9 @@ QuicConnection::ScopedPacketFlusher flusher( connection(), QuicConnection::AckBundling::NO_ACK); while (!send_message_queue_.empty()) { - struct iovec iov = {const_cast<char*>(send_message_queue_.front().data()), - send_message_queue_.front().length()}; - QuicMemSliceStorage storage( - &iov, 1, connection()->helper()->GetStreamSendBufferAllocator(), - send_message_queue_.front().length()); - MessageResult result = SendMessage(storage.ToSpan()); - const size_t message_size = send_message_queue_.front().length(); + MessageResult result = + SendMessage(QuicMemSliceSpan(&send_message_queue_.front())); // Handle errors. switch (result.status) {