]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
common/bl: simplify bl::prepare_iovs()
authorKefu Chai <tchaikov@gmail.com>
Fri, 15 Oct 2021 23:58:50 +0000 (07:58 +0800)
committerKefu Chai <tchaikov@gmail.com>
Sat, 16 Oct 2021 00:29:59 +0000 (08:29 +0800)
* consolidate the code to initialize a vector<iov>
* use an iterator to track the current vector<iovec>. less
  repeating this way.

Signed-off-by: Kefu Chai <tchaikov@gmail.com>
src/common/buffer.cc

index 6e6bf41b11871d1774205bc492bcf0e3d594df14..0fd90606862ec37ba47757e648c7c8e084228931 100644 (file)
@@ -2032,28 +2032,27 @@ int buffer::list::write_fd(int fd, uint64_t offset) const
 
 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;
 }