| // Copyright 2021 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "quic/platform/api/quic_mem_slice_storage.h" | |
| #include "quic/core/quic_utils.h" | |
| namespace quic { | |
| QuicMemSliceStorage::QuicMemSliceStorage(const struct iovec* iov, int iov_count, | |
| QuicBufferAllocator* allocator, | |
| const QuicByteCount max_slice_len) { | |
| if (iov == nullptr) { | |
| return; | |
| } | |
| QuicByteCount write_len = 0; | |
| for (int i = 0; i < iov_count; ++i) { | |
| write_len += iov[i].iov_len; | |
| } | |
| QUICHE_DCHECK_LT(0u, write_len); | |
| size_t io_offset = 0; | |
| while (write_len > 0) { | |
| size_t slice_len = std::min(write_len, max_slice_len); | |
| QuicBuffer buffer(allocator, slice_len); | |
| QuicUtils::CopyToBuffer(iov, iov_count, io_offset, slice_len, | |
| buffer.data()); | |
| storage_.push_back(QuicMemSlice(std::move(buffer))); | |
| write_len -= slice_len; | |
| io_offset += slice_len; | |
| } | |
| } | |
| } // namespace quic |