From: Radoslaw Zarzynski Date: Mon, 19 Jul 2021 13:55:18 +0000 (+0000) Subject: common/bl: c_str() examines length instead of no. of bptrs. X-Git-Tag: v17.1.0~891^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=edf3bbc004409098b9bb3ec7a369a99b51cb131a;p=ceph.git common/bl: c_str() examines length instead of no. of bptrs. This approach has 2 adventages: * it takes into consideration the specical case of a bufferlist that carries solely empty bptrs while * allowing compilers to optimize-out the load-and-check of `_len` we already do in `rebuild()` which is called by `c_str()`. ```cpp void buffer::list::rebuild() { if (_len == 0) { _carriage = &always_empty_bptr; _buffers.clear_and_dispose(); _num = 0; return; } // ... } ``` Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/common/buffer.cc b/src/common/buffer.cc index a4df5e754b02..8ade26dc9117 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -1523,16 +1523,15 @@ static ceph::spinlock debug_lock; */ char *buffer::list::c_str() { - switch (get_num_buffers()) { - case 0: - // no buffers - return nullptr; - case 1: - // good, we're already contiguous. - break; - default: + if (length() == 0) { + return nullptr; // no non-empty buffers + } + + auto iter = std::cbegin(_buffers); + ++iter; + + if (iter != std::cend(_buffers)) { rebuild(); - break; } return _buffers.front().c_str(); }