Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
bb::ipc::MpscShmServer Class Reference

IPC server implementation using shared memory with multi-client support. More...

#include <mpsc_shm_server.hpp>

Inheritance diagram for bb::ipc::MpscShmServer:
bb::ipc::IpcServer

Public Member Functions

 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)
 
 ~MpscShmServer () override
 
 MpscShmServer (const MpscShmServer &)=delete
 
MpscShmServeroperator= (const MpscShmServer &)=delete
 
 MpscShmServer (MpscShmServer &&)=delete
 
MpscShmServeroperator= (MpscShmServer &&)=delete
 
bool listen () override
 Start listening for client connections.
 
int wait_for_data (uint64_t timeout_ns) override
 Wait for data from any connected client.
 
std::span< const uint8_t > receive (int client_id) override
 Receive next message from a specific client.
 
void release (int client_id, size_t message_size) override
 Release/consume the previously received message.
 
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.
 
void wakeup_all () override
 Wake all blocked threads (for graceful shutdown)
 
- Public Member Functions inherited from bb::ipc::IpcServer
 IpcServer ()=default
 
virtual ~IpcServer ()=default
 
 IpcServer (const IpcServer &)=delete
 
IpcServeroperator= (const IpcServer &)=delete
 
 IpcServer (IpcServer &&)=delete
 
IpcServeroperator= (IpcServer &&)=delete
 
virtual void request_shutdown ()
 Request graceful shutdown.
 
virtual int accept ()
 Accept a new client connection (optional for some transports)
 
virtual void run (const Handler &handler)
 Run server event loop with handler.
 

Static Public Attributes

static constexpr size_t DEFAULT_RING_SIZE = 1 << 20
 

Private Attributes

std::string base_name_
 
size_t max_clients_
 
size_t request_ring_size_
 
size_t response_ring_size_
 
std::optional< MpscConsumerrequest_consumer_
 
std::vector< SpscShmresponse_rings_
 

Additional Inherited Members

- Public Types inherited from bb::ipc::IpcServer
using Handler = std::function< std::vector< uint8_t >(int client_id, std::span< const uint8_t > request)>
 High-level request handler function type.
 
- Static Public Member Functions inherited from bb::ipc::IpcServer
static std::unique_ptr< IpcServercreate_socket (const std::string &socket_path, int max_clients)
 
static std::unique_ptr< IpcServercreate_shm (const std::string &base_name, size_t request_ring_size=static_cast< size_t >(1024 *1024), size_t response_ring_size=static_cast< size_t >(1024 *1024))
 
static std::unique_ptr< IpcServercreate_mpsc_shm (const std::string &base_name, size_t max_clients, size_t request_ring_size=static_cast< size_t >(1024 *1024), size_t response_ring_size=static_cast< size_t >(1024 *1024))
 
- Protected Attributes inherited from bb::ipc::IpcServer
std::atomic< bool > shutdown_requested_ { false }
 

Detailed Description

IPC server implementation using shared memory with multi-client support.

Uses MPSC (multi-producer single-consumer) for requests and per-client SPSC rings for responses. Supports up to max_clients concurrent clients.

Shared memory layout:

  • Request: MPSC consumer with one SPSC ring per client (client writes, server reads)
  • Response: Separate SPSC ring per client (server writes, client reads)

Definition at line 26 of file mpsc_shm_server.hpp.

Constructor & Destructor Documentation

◆ MpscShmServer() [1/3]

bb::ipc::MpscShmServer::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 
)
inline

Definition at line 30 of file mpsc_shm_server.hpp.

◆ ~MpscShmServer()

bb::ipc::MpscShmServer::~MpscShmServer ( )
inlineoverride

Definition at line 40 of file mpsc_shm_server.hpp.

◆ MpscShmServer() [2/3]

bb::ipc::MpscShmServer::MpscShmServer ( const MpscShmServer )
delete

◆ MpscShmServer() [3/3]

bb::ipc::MpscShmServer::MpscShmServer ( MpscShmServer &&  )
delete

Member Function Documentation

◆ close()

void bb::ipc::MpscShmServer::close ( )
inlineoverridevirtual

Close the server and all client connections.

Implements bb::ipc::IpcServer.

Definition at line 123 of file mpsc_shm_server.hpp.

◆ listen()

bool bb::ipc::MpscShmServer::listen ( )
inlineoverridevirtual

Start listening for client connections.

Returns
true if successful, false otherwise

Implements bb::ipc::IpcServer.

Definition at line 48 of file mpsc_shm_server.hpp.

◆ operator=() [1/2]

MpscShmServer & bb::ipc::MpscShmServer::operator= ( const MpscShmServer )
delete

◆ operator=() [2/2]

MpscShmServer & bb::ipc::MpscShmServer::operator= ( MpscShmServer &&  )
delete

◆ receive()

std::span< const uint8_t > bb::ipc::MpscShmServer::receive ( int  client_id)
inlineoverridevirtual

Receive next message from a specific client.

Blocks until a complete message is available. Returns a span pointing to the message data. For shared memory, this is a zero-copy view directly into the ring buffer. For sockets, this is a view into an internal buffer.

The message remains valid until release() is called with the message size.

Parameters
client_idClient to receive from
Returns
Span of message data (empty only on error/disconnect)

Implements bb::ipc::IpcServer.

Definition at line 87 of file mpsc_shm_server.hpp.

◆ release()

void bb::ipc::MpscShmServer::release ( int  client_id,
size_t  message_size 
)
inlineoverridevirtual

Release/consume the previously received message.

Must be called after receive() to advance to the next message. For shared memory, this releases space in the ring buffer. For sockets, this is a no-op (message already consumed during receive).

Parameters
client_idClient whose message to release
message_sizeSize of the message being released (from span.size())

Implements bb::ipc::IpcServer.

Definition at line 107 of file mpsc_shm_server.hpp.

◆ send()

bool bb::ipc::MpscShmServer::send ( int  client_id,
const void *  data,
size_t  len 
)
inlineoverridevirtual

Send a message to a specific client.

Parameters
client_idClient to send to
dataPointer to message data
lenLength of message in bytes
Returns
true if sent successfully, false on error

Implements bb::ipc::IpcServer.

Definition at line 115 of file mpsc_shm_server.hpp.

◆ wait_for_data()

int bb::ipc::MpscShmServer::wait_for_data ( uint64_t  timeout_ns)
inlineoverridevirtual

Wait for data from any connected client.

Parameters
timeout_nsMaximum time to wait in nanoseconds (0 = non-blocking poll)
Returns
Client ID that has data available, or -1 on timeout/error

Implements bb::ipc::IpcServer.

Definition at line 78 of file mpsc_shm_server.hpp.

◆ wakeup_all()

void bb::ipc::MpscShmServer::wakeup_all ( )
inlineoverridevirtual

Wake all blocked threads (for graceful shutdown)

Wakes any threads blocked in wait_for_data() or other blocking operations. Used by signal handlers to trigger graceful shutdown without waiting for timeouts.

Reimplemented from bb::ipc::IpcServer.

Definition at line 135 of file mpsc_shm_server.hpp.

Member Data Documentation

◆ base_name_

std::string bb::ipc::MpscShmServer::base_name_
private

Definition at line 146 of file mpsc_shm_server.hpp.

◆ DEFAULT_RING_SIZE

constexpr size_t bb::ipc::MpscShmServer::DEFAULT_RING_SIZE = 1 << 20
staticconstexpr

Definition at line 28 of file mpsc_shm_server.hpp.

◆ max_clients_

size_t bb::ipc::MpscShmServer::max_clients_
private

Definition at line 147 of file mpsc_shm_server.hpp.

◆ request_consumer_

std::optional<MpscConsumer> bb::ipc::MpscShmServer::request_consumer_
private

Definition at line 150 of file mpsc_shm_server.hpp.

◆ request_ring_size_

size_t bb::ipc::MpscShmServer::request_ring_size_
private

Definition at line 148 of file mpsc_shm_server.hpp.

◆ response_ring_size_

size_t bb::ipc::MpscShmServer::response_ring_size_
private

Definition at line 149 of file mpsc_shm_server.hpp.

◆ response_rings_

std::vector<SpscShm> bb::ipc::MpscShmServer::response_rings_
private

Definition at line 151 of file mpsc_shm_server.hpp.


The documentation for this class was generated from the following file: