29template <
size_t Count,
size_t Size>
32 static_assert (
isPow2 (Count),
"buffer count must be a power of two");
40 _mapping = LocalMem (Count *
sizeof (io_uring_buf));
48 io_uring_buf_reg reg = {};
49 reg.ring_addr =
reinterpret_cast<uint64_t
> (_mapping.get ());
50 reg.ring_entries = Count;
53 int ret = io_uring_register_buf_ring (_uring, ®, 0);
57 _mapping = LocalMem ();
58 lastError = std::error_code (-ret, std::system_category ());
62 _ring =
static_cast<io_uring_buf_ring*
> (_mapping.get ());
63 _base =
static_cast<char*
> (arena.getPtr (0));
64 _release = [&arena] () {
71 io_uring_buf_ring_init (_ring);
73 for (uint16_t bid = 0; bid < _count; ++bid)
75 io_uring_buf_ring_add (_ring,
get (bid), _size, bid,
static_cast<int> (_count - 1), bid);
78 io_uring_buf_ring_advance (_ring,
static_cast<int> (_count));
94 int ret = io_uring_unregister_buf_ring (_uring, _group);
98 lastError = std::error_code (-ret, std::system_category ());
105 _mapping = LocalMem ();
121 io_uring_buf_ring_add (_ring, get (bid), _size, bid,
static_cast<int> (_count - 1), 0);
122 io_uring_buf_ring_advance (_ring, 1);
void recycle(uint16_t bid) noexcept
give a buffer back.
Definition io_ring_buffer_epoll.hpp:108
uint16_t group() const noexcept
get the buffer group id.
Definition io_ring_buffer.hpp:157
int unregisterBuffer() noexcept
withdraw the buffers and give them back to the arena.
Definition io_ring_buffer_epoll.hpp:69
void * get(uint16_t bid) const noexcept
get the address of a buffer.
Definition io_ring_buffer.hpp:148
int registerBuffer(uint16_t group, LocalMem::Allocator< Count, Size > &arena)
provide the arena buffers to the backend.
Definition io_ring_buffer_epoll.hpp:30
constexpr bool isPow2(uint64_t value) noexcept
check if a value is a power of two.
Definition utils.hpp:496
std::error_code make_error_code(join::Errc code) noexcept
Create an std::error_code object.
Definition error.cpp:195
#define JOIN_UNLIKELY(x)
Definition utils.hpp:46