buffer::list::iov_vec_t buffer::list::prepare_iovs()
{
- iov_vec_t iovs;
- size_t iovs_i = 0;
size_t index = 0;
uint64_t off = 0;
- iovs.resize(_num / IOV_MAX + 1);
- iovs[iovs_i].iov.resize(
- std::min(_num - IOV_MAX * iovs_i, (size_t)IOV_MAX));
- iovs[iovs_i].offset = off;
- iovs[iovs_i].length = 0;
+ iov_vec_t iovs{_num / IOV_MAX + 1};
+ auto it = iovs.begin();
for (auto& bp : _buffers) {
- if (index == IOV_MAX) {
- iovs_i++;
+ if (index == 0) {
+ it->offset = off;
+ it->length = 0;
+ size_t nr_iov_created = std::distance(iovs.begin(), it);
+ it->iov.resize(
+ std::min(_num - IOV_MAX * nr_iov_created, (size_t)IOV_MAX));
+ }
+ it->iov[index].iov_base = (void*)bp.c_str();
+ it->iov[index].iov_len = bp.length();
+ off += bp.length();
+ it->length += bp.length();
+ if (++index == IOV_MAX) {
+ // continue with a new vector<iov> if we have more buf
+ ++it;
index = 0;
- iovs[iovs_i].offset = off;
- iovs[iovs_i].length = 0;
- iovs[iovs_i].iov.resize(
- std::min(_num - IOV_MAX * iovs_i, (size_t)IOV_MAX));
}
- iovs[iovs_i].iov[index].iov_base = (void*)bp.c_str();
- iovs[iovs_i].iov[index++].iov_len = bp.length();
- off += bp.length();
- iovs[iovs_i].length += bp.length();
}
return iovs;
}