22template<
typename T,
size_t SlotSize>
25 static_assert(std::has_single_bit(SlotSize),
"Only power-of-two number of messages size allowed.");
29 static constexpr size_t fifo_size = 65536;
30 static constexpr size_t slot_size = SlotSize;
31 static constexpr size_t num_slots = fifo_size / slot_size;
34 static constexpr size_t buffer_size = slot_size -
sizeof(value_type *);
53 template<typename Operation>
59 auto &slot = _slots[index / slot_size];
63 if (
auto ptr = slot.pointer.load(std::memory_order::acquire)) {
64 std::forward<Operation>(operation)(*ptr);
67 if (ptr ==
static_cast<void *
>(slot.buffer.data())) {
74 slot.pointer.store(
nullptr, std::memory_order::release);
82 tt_no_inline
void contended() noexcept
85 [[unlikely]] increment_counter<
"wfree_fifo">();
93 template<
typename Message,
typename... Args>
94 tt_force_inline
void emplace(Args &&...args)
noexcept requires(
sizeof(Message) <= slot_type::buffer_size)
103 ttlet index = _head.
fetch_add(slot_size, std::memory_order::relaxed);
104 tt_axiom(index % slot_size == 0);
106 auto &slot = *std::launder(std::assume_aligned<slot_size>(
reinterpret_cast<slot_type*
>(
reinterpret_cast<char*
>(
this) + index)));
114 while (slot.pointer.load(std::memory_order_acquire)) {
116 [[unlikely]] contended();
120 auto new_ptr =
new (slot.buffer.data()) Message(std::forward<Args>(args)...);
123 slot.pointer.store(new_ptr, std::memory_order::release);
130 template<
typename Message,
typename... Args>
131 tt_force_inline
void emplace(Args &&...args)
noexcept
140 ttlet index = _head.
fetch_add(slot_size, std::memory_order::relaxed);
141 tt_axiom(index % slot_size == 0);
144 auto &slot = _slots[index / slot_size];
149 ttlet new_ptr =
new Message(std::forward<Args>(args)...);
154 while (slot.pointer.load(std::memory_order::relaxed)) {
156 [[unlikely]] contended();
160 slot.pointer.store(new_ptr, std::memory_order::release);
A wait-free multiple-producer/single-consumer fifo designed for absolute performance.
Definition wfree_fifo.hpp:23
bool take_one(Operation &&operation) noexcept
Take one message from the fifo slot.
Definition wfree_fifo.hpp:54
tt_force_inline void emplace(Args &&...args) noexcept
Create an message in-place on the fifo.
Definition wfree_fifo.hpp:94
tt_force_inline void emplace(Args &&...args) noexcept
Create an message in-place on the fifo.
Definition wfree_fifo.hpp:131
Definition wfree_fifo.hpp:33
Definition concepts.hpp:18