3#include "subscriber/async.hpp"
4#include "subscriber/callback.hpp"
5#include "subscriber/queue.hpp"
6#include "subscriber/sync.hpp"
13 void* payload_addr,
bool from_callback,
bool in_isr)
19 auto sync =
static_cast<SyncBlock*
>(&block);
21 auto wake_waiter = sync->
wait_state.compare_exchange_strong(
23 std::memory_order_acquire);
30 sync->copy_payload(sync->buff_addr, payload_addr);
31 sync->timestamp = timestamp;
35 sync->sem.PostFromCallback(in_isr);
48 async->copy_payload(async->buff_addr, payload_addr);
49 async->timestamp = timestamp;
56 auto queue_block =
static_cast<QueueBlock*
>(&block);
57 queue_block->
fun(timestamp, payload_addr, *queue_block);
63 cb_block->
Run(from_callback && in_isr, timestamp, payload_addr);
70 void* payload_addr,
bool from_callback,
bool in_isr)
83 size_t payload_size,
size_t payload_alignment)
85 ASSERT(topic !=
nullptr);
86 ASSERT(payload_type_id !=
nullptr);
87 ASSERT(topic->
data_.payload_type_id == payload_type_id);
88 ASSERT(topic->
data_.payload_size == payload_size);
89 ASSERT(topic->
data_.payload_alignment == payload_alignment);
微秒时间戳 / Microsecond timestamp
红黑树的泛型数据节点,继承自 BaseNode (Generic data node for Red-Black Tree, inheriting from BaseNode).
Data data_
存储的数据 (Stored data).
static MicrosecondTimestamp GetMicroseconds()
获取当前时间的微秒级时间戳。 Gets the current timestamp in microseconds.
@ SYNC
同步等待型订阅者。Synchronous wait-based subscriber.
@ ASYNC
异步本地缓冲型订阅者。Asynchronous local-buffer subscriber.
@ QUEUE
队列转发型订阅者。Queue-forwarding subscriber.
@ CALLBACK
回调执行型订阅者。Callback-executing subscriber.
static MicrosecondTimestamp NowTimestamp()
读取当前时间戳 / Read the current timestamp
static void CheckPublishContract(TopicHandle topic, TypeID::ID payload_type_id, size_t payload_size, size_t payload_alignment)
校验一次强类型发布的运行时契约 / Check the runtime contract of one typed publish
static void DispatchSubscriber(SuberBlock &block, MicrosecondTimestamp timestamp, void *payload_addr, bool from_callback, bool in_isr)
将一条消息分发给一个订阅块 / Dispatch one message to one subscriber block
static void DispatchSubscribers(TopicHandle topic, MicrosecondTimestamp timestamp, void *payload_addr, bool from_callback, bool in_isr)
将一条消息分发给一个 topic 上的全部订阅者 / Dispatch one message to all subscribers attached to one topic
@ OK
操作成功 | Operation successful
异步订阅者自己挂的数据块 / Data block owned by one asynchronous subscriber
挂在 topic 订阅链表里的回调记录 / Callback record stored in the topic subscriber list
void Run(bool in_isr, MicrosecondTimestamp timestamp, void *payload_addr) const
通过注册时绑定的 topic payload size 执行回调 / Run the callback with the topic payload size bound at registration...
队列订阅者自己挂的数据块 / Data block owned by one queued subscriber
void(* fun)(MicrosecondTimestamp, void *, QueueBlock &)
所有订阅块共用的公共头 / Common header shared by all subscriber blocks
SuberType type
订阅块的具体种类。Concrete kind of this subscriber block.
同步订阅者自己挂的数据块 / Data block owned by one synchronous subscriber
std::atomic< uint32_t > wait_state
当前 Wait() 的挂起状态。Current pending state of Wait().
@ WAITING
当前有一个挂起的等待者。One waiter is currently pending.