From edf3bbc004409098b9bb3ec7a369a99b51cb131a Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Mon, 19 Jul 2021 13:55:18 +0000 Subject: [PATCH] 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 --- src/common/buffer.cc | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/common/buffer.cc b/src/common/buffer.cc index a4df5e754b0..8ade26dc911 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(); } -- 2.39.5