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