17 throw std::runtime_error(
18 "ring_send_msg: message too large for ring buffer, must be <= half capacity minus 4 bytes");
22 size_t total_size = 4 +
len;
23 void*
buf = ring.
claim(total_size,
static_cast<uint32_t
>(timeout_ns));
29 auto len_u32 =
static_cast<uint32_t
>(
len);
42 void* len_ptr = ring.
peek(4,
static_cast<uint32_t
>(timeout_ns));
43 if (len_ptr ==
nullptr) {
52 void* msg_ptr = ring.
peek(4 + msg_len,
static_cast<uint32_t
>(timeout_ns));
53 if (msg_ptr ==
nullptr) {
Lock-free single-producer single-consumer shared memory ring buffer.
void * peek(size_t want, uint32_t timeout_ns)
Peek contiguous readable region (blocks until available)
uint64_t capacity() const
void * claim(size_t want, uint32_t timeout_ns)
Claim contiguous space in the ring buffer (blocks until available)
void publish(size_t n)
Publish n bytes previously claimed.
const std::vector< MemoryValue > data
bool ring_send_msg(SpscShm &ring, const void *data, size_t len, uint64_t timeout_ns)
std::span< const uint8_t > ring_receive_msg(SpscShm &ring, uint64_t timeout_ns)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Single-producer/single-consumer shared-memory ring buffer (Linux, x86-64 optimized)