mirror of
https://github.com/ceph/ceph
synced 2025-02-15 23:07:55 +00:00
common/buffer: use homebrew BUF_OFFSETOF to replace offsetof()
because buffer::raw is not a standard layout type. so `offsetof()` does not always work. let's use a homebrew macro to calculate the address of `bptr_storage`. this change silences the warning like: src/common/buffer.cc:2156:15: warning: ‘offsetof’ within non-standard-layout type ‘ceph::buffer::v15_2_0::raw’ is conditionally-supported [-Winvalid-offsetof] 2156 | offsetof(buffer::raw, bptr_storage)); Signed-off-by: Kefu Chai <kchai@redhat.com>
This commit is contained in:
parent
3713645324
commit
3eed2d595e
@ -2147,13 +2147,17 @@ buffer::list buffer::list::static_from_string(string& s) {
|
||||
// const makes me generally sad.
|
||||
}
|
||||
|
||||
// buffer::raw is not a standard layout type.
|
||||
#define BUF_OFFSETOF(type, field) \
|
||||
(reinterpret_cast<std::uintptr_t>(&(((type*)1024)->field)) - 1024u)
|
||||
|
||||
bool buffer::ptr_node::dispose_if_hypercombined(
|
||||
buffer::ptr_node* const delete_this)
|
||||
{
|
||||
// in case _raw is nullptr
|
||||
const std::uintptr_t bptr =
|
||||
(reinterpret_cast<std::uintptr_t>(delete_this->_raw) +
|
||||
offsetof(buffer::raw, bptr_storage));
|
||||
BUF_OFFSETOF(buffer::raw, bptr_storage));
|
||||
const bool is_hypercombined =
|
||||
reinterpret_cast<std::uintptr_t>(delete_this) == bptr;
|
||||
if (is_hypercombined) {
|
||||
|
Loading…
Reference in New Issue
Block a user