93 void* len_ptr =
request_consumer_->peek(
static_cast<size_t>(client_id),
sizeof(uint32_t), 100000000);
94 if (len_ptr ==
nullptr) {
100 void* msg_ptr =
request_consumer_->peek(
static_cast<size_t>(client_id),
sizeof(uint32_t) + msg_len, 100000000);
101 if (msg_ptr ==
nullptr) {
117 if (client_id < 0 ||
static_cast<size_t>(client_id) >=
response_rings_.size()) {
Abstract interface for IPC server.
static MpscConsumer create(const std::string &name, size_t num_producers, size_t ring_capacity)
Create MPSC consumer.
static bool unlink(const std::string &name, size_t num_producers)
Unlink all shared memory for this MPSC system.
IPC server implementation using shared memory with multi-client support.
std::span< const uint8_t > receive(int client_id) override
Receive next message from a specific client.
std::optional< MpscConsumer > request_consumer_
std::vector< SpscShm > response_rings_
void release(int client_id, size_t message_size) override
Release/consume the previously received message.
MpscShmServer & operator=(MpscShmServer &&)=delete
void wakeup_all() override
Wake all blocked threads (for graceful shutdown)
MpscShmServer & operator=(const MpscShmServer &)=delete
size_t response_ring_size_
size_t request_ring_size_
MpscShmServer(std::string base_name, size_t max_clients, size_t request_ring_size=DEFAULT_RING_SIZE, size_t response_ring_size=DEFAULT_RING_SIZE)
bool listen() override
Start listening for client connections.
MpscShmServer(const MpscShmServer &)=delete
bool send(int client_id, const void *data, size_t len) override
Send a message to a specific client.
void close() override
Close the server and all client connections.
~MpscShmServer() override
int wait_for_data(uint64_t timeout_ns) override
Wait for data from any connected client.
MpscShmServer(MpscShmServer &&)=delete
static constexpr size_t DEFAULT_RING_SIZE
static bool unlink(const std::string &name)
Unlink shared memory object (cleanup after close)
static SpscShm create(const std::string &name, size_t min_capacity)
Create a new SPSC ring buffer.
const std::vector< MemoryValue > data
Multi-Producer Single-Consumer via SPSC rings + doorbell futex.
bool ring_send_msg(SpscShm &ring, const void *data, size_t len, uint64_t timeout_ns)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::string to_string(bb::avm2::ValueTag tag)
Single-producer/single-consumer shared-memory ring buffer (Linux, x86-64 optimized)