Apollo:源码分析之Transmitter

Transmitter

Transmitter

cyber/transport/transmitter/transmitter.h

一个基类
在这里插入图片描述

Endpoint有如下数据成员:

数据类型 变量名字 说明
bool enabled_ 当前终端是否启用
Identity id_ 每一个终端都有独一无二的id
RoleAttributes attr_ 终端的属性,是一个proto文件

成员变量

Transmitter有如下数据成员:

数据类型 变量名字 说明
uint64_t seq_num_; 当前消息的序列号,默认从0开始数
MessageInfo msg_info_; 要转发的消息信息

MessageInfo是一个类,它有如下成员

数据类型 变量名字 说明
Identity sender_id_; 要是这条消息的发送方id,就是继承来的Endpoint->id_
uint64_t channel_id_ = 0; 这条消息需要放入哪个channel
uint64_t s seq_num_ = 0; 当前消息的序列号,与当前Transmitter的类成员seq_num_一致
Identity spare_id_;

重要函数

在这里插入图片描述
在这里插入图片描述
从上面可以看到,具体的转发工作由它的子类完成。

但是需要关注一下 PerfEventCache。这个稍后再讲

IntraTransmitter

指针传递,进程内通信

在这里插入图片描述

成员变量

数据类型 变量名字 说明
unit64_t channel_id_
IntraDispatcherPtr dispatcher_

重要函数

重点关注 IntraTransmitter< M>::Transmit即可,其他暂时不需要关注:

在这里插入图片描述
可以看到重要工作都是由 IntraDispatcherPtr完成的,这里只是起一个转发的作用

ShmTransmitter

共享内存,进程间通信

在这里插入图片描述

成员变量

数据类型 变量名字 说明
SegmentPtr segment_
  • 负责管理一段共享内存
  • 提供了一些接口可以确保在线程安全的前提下拿到共享内场中的对象
  • 当每次 ShmTransmitter< M >::Enable()时如果没有初始化那么就 segment_ = SegmentFactory::CreateSegment(channel_id_); 当disable时就销毁
uint64_t channel_id_
  • 构造函数中指定:channel_id_(RoleAttributes.channel_id())
uint64_t host_id_
  • 当前主机的ip地址,
  • 构造函数中指定:host_id_ = common::Hash(RoleAttributes.host_ip());
NotifierPtr notifier_
  • 当每次 ShmTransmitter< M >::Enable()时如果没有初始化那么就 notifier_ = NotifierFactory::CreateNotifier();当disable时就销毁

重要函数

重点关注 ShmTransmitter< M>::Transmit即可,其他暂时不需要关注:

在这里插入图片描述

实现:

  1. 申请空间
    在这里插入图片描述

  2. 写入数据
    在这里插入图片描述

  3. 通知 or 记录了刚刚写入的数据信息,以后可以通过readableinfo来读取数据
    在这里插入图片描述

RtpsTransmitter

猜你喜欢

转载自blog.csdn.net/zhizhengguan/article/details/129430378