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);
45 auto async =
static_cast<ASyncBlock*
>(&block);
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)
72 topic->data_.subers.Foreach<SuberBlock>(
73 [=](SuberBlock& block)
75 DispatchSubscriber(block, timestamp, payload_addr, from_callback, in_isr);
82void Topic::CheckPublishContract(TopicHandle topic, TypeID::ID payload_type_id,
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);
回调函数封装块,提供参数绑定与擦除调用入口 / Callback block with bound argument and erased invoke entry
微秒时间戳 / Microsecond timestamp
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
LibXR 命名空间 / LibXR namespace.
@ OK
操作成功 / Operation successful
@ WAITING
当前有一个挂起的等待者 / One waiter is currently pending.