28 alignas(64) std::atomic<uint32_t>
seq;
50 static MpscConsumer create(
const std::string& name,
size_t num_producers,
size_t ring_capacity);
58 static bool unlink(
const std::string& name,
size_t num_producers);
82 void*
peek(
size_t ring_idx,
size_t want, uint32_t timeout_ns);
89 void release(
size_t ring_idx,
size_t n);
137 void*
claim(
size_t want, uint32_t timeout_ns);
Multi-producer single-consumer - consumer side.
int wait_for_data(uint32_t timeout_ns)
Wait for data on any ring.
static MpscConsumer create(const std::string &name, size_t num_producers, size_t ring_capacity)
Create MPSC consumer.
MpscConsumer & operator=(const MpscConsumer &)=delete
MpscConsumer & operator=(MpscConsumer &&other) noexcept
void * peek(size_t ring_idx, size_t want, uint32_t timeout_ns)
Peek data from specific ring.
void release(size_t ring_idx, size_t n)
Release data from specific ring.
void wakeup_all()
Wake all blocked threads (for graceful shutdown) Wakes consumer blocked on doorbell and all producers...
static bool unlink(const std::string &name, size_t num_producers)
Unlink all shared memory for this MPSC system.
MpscConsumer(const MpscConsumer &)=delete
std::vector< SpscShm > rings_
Multi-producer single-consumer - producer side.
MpscProducer & operator=(MpscProducer &&other) noexcept
static MpscProducer connect(const std::string &name, size_t producer_id)
Connect to MPSC system as a producer.
void publish(size_t n)
Publish data to producer's ring (rings doorbell)
MpscProducer & operator=(const MpscProducer &)=delete
MpscProducer(const MpscProducer &)=delete
void * claim(size_t want, uint32_t timeout_ns)
Claim space in producer's ring.
Lock-free single-producer single-consumer shared memory ring buffer.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Single-producer/single-consumer shared-memory ring buffer (Linux, x86-64 optimized)
Shared doorbell for waking consumer.
std::atomic< uint32_t > seq
std::array< uint8_t, 60 > _pad0
std::atomic< bool > consumer_blocked
std::array< uint8_t, 63 > _pad1