xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/common/quiche_mem_slice_storage.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2021 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "quiche/common/quiche_mem_slice_storage.h"
6 
7 #include "quiche/quic/core/quic_utils.h"
8 
9 namespace quiche {
10 
QuicheMemSliceStorage(const struct iovec * iov,int iov_count,QuicheBufferAllocator * allocator,const quic::QuicByteCount max_slice_len)11 QuicheMemSliceStorage::QuicheMemSliceStorage(
12     const struct iovec* iov, int iov_count, QuicheBufferAllocator* allocator,
13     const quic::QuicByteCount max_slice_len) {
14   if (iov == nullptr) {
15     return;
16   }
17   quic::QuicByteCount write_len = 0;
18   for (int i = 0; i < iov_count; ++i) {
19     write_len += iov[i].iov_len;
20   }
21   QUICHE_DCHECK_LT(0u, write_len);
22 
23   size_t io_offset = 0;
24   while (write_len > 0) {
25     size_t slice_len = std::min(write_len, max_slice_len);
26     QuicheBuffer buffer = QuicheBuffer::CopyFromIovec(allocator, iov, iov_count,
27                                                       io_offset, slice_len);
28     storage_.push_back(QuicheMemSlice(std::move(buffer)));
29     write_len -= slice_len;
30     io_offset += slice_len;
31   }
32 }
33 
34 }  // namespace quiche
35