libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
publish.cpp
1#include <atomic>
2
3#include "subscriber/async.hpp"
4#include "subscriber/callback.hpp"
5#include "subscriber/queue.hpp"
6#include "subscriber/sync.hpp"
7#include "timebase.hpp"
8#include "topic.hpp"
9
10using namespace LibXR;
11
13 void* payload_addr, bool from_callback, bool in_isr)
14{
15 switch (block.type)
16 {
17 case SuberType::SYNC:
18 {
19 auto sync = static_cast<SyncBlock*>(&block);
20 uint32_t expected = SyncBlock::WAITING;
21 auto wake_waiter = sync->wait_state.compare_exchange_strong(
22 expected, SyncBlock::WAIT_CLAIMED, std::memory_order_acq_rel,
23 std::memory_order_acquire);
24
25 if (!wake_waiter)
26 {
27 break;
28 }
29
30 sync->copy_payload(sync->buff_addr, payload_addr);
31 sync->timestamp = timestamp;
32
33 if (from_callback)
34 {
35 sync->sem.PostFromCallback(in_isr);
36 }
37 else
38 {
39 sync->sem.Post();
40 }
41 break;
42 }
44 {
45 auto async = static_cast<ASyncBlock*>(&block);
46 if (async->state.load(std::memory_order_acquire) == ASyncSubscriberState::WAITING)
47 {
48 async->copy_payload(async->buff_addr, payload_addr);
49 async->timestamp = timestamp;
50 async->state.store(ASyncSubscriberState::DATA_READY, std::memory_order_release);
51 }
52 break;
53 }
55 {
56 auto queue_block = static_cast<QueueBlock*>(&block);
57 queue_block->fun(timestamp, payload_addr, *queue_block);
58 break;
59 }
61 {
62 auto cb_block = static_cast<CallbackBlock*>(&block);
63 cb_block->Run(from_callback && in_isr, timestamp, payload_addr);
64 break;
65 }
66 }
67}
68
70 void* payload_addr, bool from_callback, bool in_isr)
71{
72 topic->data_.subers.Foreach<SuberBlock>(
73 [=](SuberBlock& block)
74 {
75 DispatchSubscriber(block, timestamp, payload_addr, from_callback, in_isr);
76 return ErrorCode::OK;
77 });
78}
79
81
82void Topic::CheckPublishContract(TopicHandle topic, TypeID::ID payload_type_id,
83 size_t payload_size, size_t payload_alignment)
84{
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);
90}
微秒时间戳 / Microsecond timestamp
红黑树的泛型数据节点,继承自 BaseNode (Generic data node for Red-Black Tree, inheriting from BaseNode).
Definition rbt.hpp:63
Data data_
存储的数据 (Stored data).
Definition rbt.hpp:98
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
Definition publish.cpp:80
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
Definition publish.cpp:82
static void DispatchSubscriber(SuberBlock &block, MicrosecondTimestamp timestamp, void *payload_addr, bool from_callback, bool in_isr)
将一条消息分发给一个订阅块 / Dispatch one message to one subscriber block
Definition publish.cpp:12
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
Definition publish.cpp:69
LibXR 命名空间
Definition ch32_can.hpp:14
@ OK
操作成功 | Operation successful
异步订阅者自己挂的数据块 / Data block owned by one asynchronous subscriber
Definition async.hpp:26
挂在 topic 订阅链表里的回调记录 / Callback record stored in the topic subscriber list
Definition callback.hpp:566
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...
Definition callback.hpp:586
队列订阅者自己挂的数据块 / Data block owned by one queued subscriber
Definition queue.hpp:12
void(* fun)(MicrosecondTimestamp, void *, QueueBlock &)
Definition queue.hpp:14
所有订阅块共用的公共头 / Common header shared by all subscriber blocks
Definition topic.hpp:237
SuberType type
订阅块的具体种类。Concrete kind of this subscriber block.
Definition topic.hpp:238
同步订阅者自己挂的数据块 / Data block owned by one synchronous subscriber
Definition sync.hpp:12
std::atomic< uint32_t > wait_state
当前 Wait() 的挂起状态。Current pending state of Wait().
Definition sync.hpp:38
@ WAITING
当前有一个挂起的等待者。One waiter is currently pending.
Definition sync.hpp:26