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