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) {