diff --git a/src/linyaps_box/utils/ringbuffer.cpp b/src/linyaps_box/utils/ringbuffer.cpp index 38ce1f4..f60e91f 100644 --- a/src/linyaps_box/utils/ringbuffer.cpp +++ b/src/linyaps_box/utils/ringbuffer.cpp @@ -16,7 +16,7 @@ auto ring_buffer_deleter::operator()(ring_buffer *rb) const -> void rb->~ring_buffer(); ::operator delete(rb, total_size, - std::align_val_t(std::hardware_constructive_interference_size)); + std::align_val_t(compat::hardware_constructive_interference_size)); } auto ring_buffer::create(std::size_t requested_capacity) @@ -31,7 +31,7 @@ auto ring_buffer::create(std::size_t requested_capacity) const auto total_size = sizeof(ring_buffer) + capacity; auto *mem = ::operator new(total_size, - std::align_val_t(std::hardware_constructive_interference_size)); + std::align_val_t(compat::hardware_constructive_interference_size)); auto *rb = new (mem) ring_buffer(capacity); return { rb, ring_buffer_deleter(total_size) }; } diff --git a/src/linyaps_box/utils/ringbuffer.h b/src/linyaps_box/utils/ringbuffer.h index 05c466a..c170dd1 100644 --- a/src/linyaps_box/utils/ringbuffer.h +++ b/src/linyaps_box/utils/ringbuffer.h @@ -12,6 +12,18 @@ #include #include +namespace linyaps_box::compat { +#ifdef __cpp_lib_hardware_interference_size +using std::hardware_constructive_interference_size; +using std::hardware_destructive_interference_size; +#else +// default to 64 bytes if not defined +// if the platform has different cache line size, please define these macros accordingly +constexpr std::size_t hardware_constructive_interference_size = 64; +constexpr std::size_t hardware_destructive_interference_size = 64; +#endif +} // namespace linyaps_box::compat + namespace linyaps_box::utils { class ring_buffer; @@ -26,7 +38,7 @@ struct ring_buffer_deleter std::size_t total_size{ 0 }; }; -class alignas(std::hardware_constructive_interference_size) ring_buffer +class alignas(compat::hardware_constructive_interference_size) ring_buffer { using iov_view = std::array;