1#include "mpmc_queue_base.hpp"
6#include "libxr_mem.hpp"
16 : element_size_(element_size),
18 payload_stride_(AlignUpChecked(element_size_, alignof(size_t))),
26 REQUIRE(
capacity_ <=
static_cast<size_t>(std::numeric_limits<SequenceDiffType>::max()));
34 for (
size_t index = 0; index <
capacity_; ++index)
37 std::memory_order_relaxed);
71 if (
tail_.compare_exchange_weak(position, position + 1, std::memory_order_relaxed,
72 std::memory_order_relaxed))
75 slot.
value.store(position + 1, std::memory_order_release);
86 position =
tail_.load(std::memory_order_relaxed);
110 if (
head_.compare_exchange_weak(position, position + 1, std::memory_order_relaxed,
111 std::memory_order_relaxed))
113 if (value !=
nullptr)
118 std::memory_order_release);
129 position =
head_.load(std::memory_order_relaxed);
143 const SequenceType used = tail_snapshot - head_snapshot;
174 REQUIRE(value <= std::numeric_limits<size_t>::max() - (align - 1));
175 return ((value + align - 1) / align) * align;
186 if (lhs == 0 || rhs == 0)
191 REQUIRE(lhs <= std::numeric_limits<size_t>::max() / rhs);
size_t SequenceType
单调递增的逻辑序号类型 / Monotonic logical sequence type.
MPMCQueueBase(size_t element_size, size_t capacity)
构造一个字节队列内核 / Construct one byte-queue core
static size_t MultiplyChecked(size_t lhs, size_t rhs)
安全地计算乘积。 Safely multiply two size values.
std::make_signed_t< SequenceType > SequenceDiffType
序号差值判定类型 / Signed type used for sequence-delta checks.
static size_t AlignUpChecked(size_t value, size_t align)
安全地向上对齐字节数。 Safely align one byte count upward.
size_t Size() const
获取并发快照下的当前元素数 / Get the current approximate element count
std::byte * payloads_
payload 字节缓冲区。 Byte buffer storing payloads.
const size_t payload_stride_
相邻 payload 槽位之间的步长。 Byte stride between adjacent payload slots.
std::atomic< SequenceType > head_
下一个待出队的逻辑位置。 Next logical dequeue position.
const size_t capacity_
队列容量。 Queue capacity.
ErrorCode PopBytes(void *value=nullptr)
按字节出队一个 payload;传空指针时只丢弃队头元素 / Dequeue one payload by bytes; pass null to discard the front item only
static constexpr size_t PAYLOAD_ALLOC_ALIGN
payload 缓冲区整体分配对齐 / Allocation alignment used for the whole payload buffer
void * PayloadPtr(size_t index)
获取指定槽位 payload 起始地址。 Get the payload base address of one slot.
~MPMCQueueBase()
析构字节队列内核 / Destroy the byte-queue core
std::atomic< SequenceType > tail_
下一个待入队的逻辑位置。 Next logical enqueue position.
SequenceCell * sequences_
槽序号数组。 Array of per-slot sequence cells.
ErrorCode PushBytes(const void *value)
按字节入队一个 payload / Enqueue one payload by bytes
const size_t element_size_
单个 payload 的字节数。 Byte size of one payload.
static void FastCopy(void *dst, const void *src, size_t size)
快速内存拷贝 / Fast memory copy
@ PTR_NULL
空指针 | Null pointer
@ OK
操作成功 | Operation successful
每个逻辑槽对应的序号单元。 Sequence cell for one logical slot.
std::atomic< SequenceType > value
当前槽的逻辑序号。 Current logical sequence of the slot.