7#include "operation.hpp"
33 enum class Phase : uint32_t
38 CLAIMED_WITH_WAITER = 3U,
43 static constexpr uint32_t EVENT_BIT = 1U << 31U;
45 static constexpr uint32_t PHASE_MASK = EVENT_BIT - 1U;
55 static Phase GetPhase(uint32_t state) {
return static_cast<Phase
>(state & PHASE_MASK); }
58 static uint32_t WithPhase(uint32_t state, Phase phase)
60 return (state & EVENT_BIT) |
static_cast<uint32_t
>(phase);
64 static bool HasEvent(uint32_t state) {
return (state & EVENT_BIT) != 0U; }
67 [[nodiscard]]
bool TryClaimIdle();
69 [[nodiscard]]
bool HasEnough(
size_t available,
size_t requested)
const;
71 void ReleaseClaimed(
bool in_isr);
73 [[nodiscard]]
bool ClaimBlockCompletion();
75 void ReleaseBlockCompletion(
bool in_isr);
77 void PublishProduced(
bool in_isr);
79 void NotifyDataAvailable(
bool in_isr);
81 void ProcessPendingReads(
bool in_isr);
83 void CompleteClaimedRead(
bool in_isr);
85 void CompleteClaimedBlock(
bool in_isr);
144 template <
typename Writer>
147 ASSERT_FROM_CALLBACK(!finished_, in_isr_);
151 [&](
void* first,
size_t first_size,
void* second,
size_t second_size) ->
size_t
153 const size_t produced = writer(
static_cast<uint8_t*
>(first), first_size,
154 static_cast<uint8_t*
>(second), second_size);
155 ASSERT_FROM_CALLBACK(produced <= first_size + second_size, in_isr_);
158 dirty_ = dirty_ || (produced != 0U);
172 [[nodiscard]]
size_t Capacity()
const;
193 bool finished_ =
false;
203 explicit ReadPort(
size_t buffer_size = 128U);
236 [[nodiscard]]
size_t Size()
const;
242 [[nodiscard]]
size_t Capacity()
const;
249 [[nodiscard]]
bool Readable()
const;
327 std::atomic<uint32_t> state_{
static_cast<uint32_t
>(Phase::IDLE)};
由读写端口组成的单向管道 / Unidirectional pipe connecting read and write ports.
可写原始数据视图 / Mutable raw data view
接收队列的短期写入接口 / Short-lived producer interface for the RX queue.
size_t PushWithWriter(size_t limit, Writer &&writer)
通过回调直接写入接收队列 / Fill the RX queue through a writer callback.
void Publish()
结束本次写入并通知挂起读 / End production and notify a pending read.
size_t EmptySize() const
获取接收队列当前空闲空间 / Get current RX queue free space.
~ReadQueue()
开发期检查是否已 Publish / Check for Publish in development builds.
ErrorCode PushBatch(const uint8_t *data, size_t size)
批量复制字节到接收队列 / Copy a batch of bytes into the RX queue.
size_t Capacity() const
获取接收队列容量 / Get the RX queue capacity.
基于 SPSC 字节队列的读端口 / Read endpoint backed by an SPSC byte queue.
virtual void OnReadQueueSpaceAvailable(bool)
接收队列空间可用通知 / RX queue space-available notification.
ReadPort(size_t buffer_size=128U)
构造读端口并分配接收队列 / Construct a read port and allocate its RX queue.
virtual ~ReadPort()=default
析构读端口 / Destroy the read port.
size_t EmptySize() const
获取当前空闲空间 / Get current free space.
ErrorCode ClearQueuedData(bool in_isr=false)
丢弃当前已排队的接收字节 / Discard currently queued RX bytes.
size_t Size() const
获取当前排队的数据量 / Get the current queued data size.
bool Readable() const
检查端口是否支持读取 / Check whether the port supports reads.
size_t Capacity() const
获取接收队列容量 / Get the RX queue capacity.
ErrorCode operator()(RawData data, ReadOperation &op, bool in_isr=false)
提交读请求 / Submit a read request.
ReadQueue GetReadQueue(bool in_isr=false)
获取后端接收入队接口 / Obtain the backend RX producer interface.
单生产者单消费者无锁队列 / Single-producer single-consumer lock-free queue.
size_t ProduceWithWriter(size_t limit, Writer &&writer)
通过一次双 span 回调生产 payload 前缀 / Produce a payload prefix through one two-span writer callback.
LibXR 命名空间 / LibXR namespace.
ErrorCode
定义错误码枚举 / Defines an enumeration for error codes
@ OK
操作成功 / Operation successful