Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
mpsc_shm.hpp
Go to the documentation of this file.
1
8#pragma once
9
10#include "spsc_shm.hpp"
11#include <array>
12#include <atomic>
13#include <cstddef>
14#include <cstdint>
15#include <string>
16#include <vector>
17
18namespace bb::ipc {
19
26struct alignas(64) MpscDoorbell {
27 // Producer-written (written by producers in publish())
28 alignas(64) std::atomic<uint32_t> seq;
29 std::array<uint8_t, 60> _pad0;
30
31 // Consumer-written (written by consumer in wait_for_data())
32 alignas(64) std::atomic<bool> consumer_blocked; // Set RIGHT BEFORE futex_wait, cleared RIGHT AFTER
33 std::array<uint8_t, 63> _pad1;
34};
35
42 public:
50 static MpscConsumer create(const std::string& name, size_t num_producers, size_t ring_capacity);
51
58 static bool unlink(const std::string& name, size_t num_producers);
59
60 // Move-only
61 MpscConsumer(MpscConsumer&& other) noexcept;
62 MpscConsumer& operator=(MpscConsumer&& other) noexcept;
63 MpscConsumer(const MpscConsumer&) = delete;
65
67
73 int wait_for_data(uint32_t timeout_ns);
74
82 void* peek(size_t ring_idx, size_t want, uint32_t timeout_ns);
83
89 void release(size_t ring_idx, size_t n);
90
95 void wakeup_all();
96
97 private:
98 MpscConsumer(std::vector<SpscShm>&& rings, int doorbell_fd, size_t doorbell_len, MpscDoorbell* doorbell);
99
101 int doorbell_fd_ = -1;
102 size_t doorbell_len_ = 0;
104 size_t last_served_ = 0; // Round-robin fairness
105 bool previous_had_data_ = false; // Adaptive spinning: only spin if previous call found data
106};
107
114 public:
121 static MpscProducer connect(const std::string& name, size_t producer_id);
122
123 // Move-only
124 MpscProducer(MpscProducer&& other) noexcept;
125 MpscProducer& operator=(MpscProducer&& other) noexcept;
126 MpscProducer(const MpscProducer&) = delete;
128
130
137 void* claim(size_t want, uint32_t timeout_ns);
138
143 void publish(size_t n);
144
145 private:
146 MpscProducer(SpscShm&& ring, int doorbell_fd, size_t doorbell_len, MpscDoorbell* doorbell, size_t producer_id);
147
149 int doorbell_fd_ = -1;
150 size_t doorbell_len_ = 0;
152 size_t producer_id_ = 0;
153};
154
155} // namespace bb::ipc
Multi-producer single-consumer - consumer side.
Definition mpsc_shm.hpp:41
int wait_for_data(uint32_t timeout_ns)
Wait for data on any ring.
Definition mpsc_shm.cpp:151
static MpscConsumer create(const std::string &name, size_t num_producers, size_t ring_capacity)
Create MPSC consumer.
Definition mpsc_shm.cpp:78
MpscDoorbell * doorbell_
Definition mpsc_shm.hpp:103
MpscConsumer & operator=(const MpscConsumer &)=delete
MpscConsumer & operator=(MpscConsumer &&other) noexcept
Definition mpsc_shm.cpp:41
void * peek(size_t ring_idx, size_t want, uint32_t timeout_ns)
Peek data from specific ring.
Definition mpsc_shm.cpp:246
void release(size_t ring_idx, size_t n)
Release data from specific ring.
Definition mpsc_shm.cpp:254
void wakeup_all()
Wake all blocked threads (for graceful shutdown) Wakes consumer blocked on doorbell and all producers...
Definition mpsc_shm.cpp:261
static bool unlink(const std::string &name, size_t num_producers)
Unlink all shared memory for this MPSC system.
Definition mpsc_shm.cpp:138
MpscConsumer(const MpscConsumer &)=delete
std::vector< SpscShm > rings_
Definition mpsc_shm.hpp:100
Multi-producer single-consumer - producer side.
Definition mpsc_shm.hpp:113
MpscProducer & operator=(MpscProducer &&other) noexcept
Definition mpsc_shm.cpp:296
static MpscProducer connect(const std::string &name, size_t producer_id)
Connect to MPSC system as a producer.
Definition mpsc_shm.cpp:333
void publish(size_t n)
Publish data to producer's ring (rings doorbell)
Definition mpsc_shm.cpp:369
MpscProducer & operator=(const MpscProducer &)=delete
MpscProducer(const MpscProducer &)=delete
MpscDoorbell * doorbell_
Definition mpsc_shm.hpp:151
void * claim(size_t want, uint32_t timeout_ns)
Claim space in producer's ring.
Definition mpsc_shm.cpp:364
Lock-free single-producer single-consumer shared memory ring buffer.
Definition spsc_shm.hpp:70
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Single-producer/single-consumer shared-memory ring buffer (Linux, x86-64 optimized)
Shared doorbell for waking consumer.
Definition mpsc_shm.hpp:26
std::atomic< uint32_t > seq
Definition mpsc_shm.hpp:28
std::array< uint8_t, 60 > _pad0
Definition mpsc_shm.hpp:29
std::atomic< bool > consumer_blocked
Definition mpsc_shm.hpp:32
std::array< uint8_t, 63 > _pad1
Definition mpsc_shm.hpp:33