热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

百度Apollocyber中的transport和shm处理整理

近期一直在阅读apollo中cyber部分的源码,所以把最近看的代码稍微整理了下。transport部分:transport构造,tra

近期一直在阅读apollo中cyber部分的源码,所以把最近看的代码稍微整理了下。

transport部分:
transport构造,transport一开始就创建好了intra、shm、rtps这三种dispatcher。

Transport::Transport||->CreateParticipant // 给rtps用||->NotifierFactory::CreateNotifier // 这个notifier感觉没啥用啊||->intra_dispatcher_||->shm_dispatcher_||->ShmDispatcher::ShmDispatcher||->ShmDispatcher::Init||->NotifierFactory::CreateNotifier // 这里的notifier才是真正有用的||->ShmDispatcher::ThreadFunc // 这里起了个listen的线程||->Listen // 循环listen,这里有点奇怪,为啥没有每个channel 都有一个notifier?||->rtps_dispatcher_||->RtpsDispatcher::set_participant() // 将上面的CreateParticipant设置进去

创建transmitter,根据mode(intra、shm、rtps、Hybrid)去创建对应的transmitter,transmitter 继承于Endpoint,Endpoint中有三个成员,enabled_用于标记是否被启用,Identity 我理解应该是每个Endpoint的id唯一,RoleAttributes这就是读取的配置。

Transport::CreateTransmitter||->switch (mode) // 按照模式创建对应的transmitter,如果不填,默认hybrid||->IntraTransmitter||->ShmTransmitter // 继承关系:ShmTransmitter->Transmitter->Endpoint||->RtpsTransmitter||->HybridTransmitter||->Enable // 调用具体派生类的Enable,这里HybridTransmitter不会触发Enable||->ShmTransmitter::Enable // 这里暂时只看shm的Enable||->ShmTransmitter::Enable||->SegmentFactory::CreateSegment //一个ShmTransmitter对应一个Segment,一个Segment对应一个channelid||->NotifierFactory::CreateNotifier // 这里主要根据配置来看创建的是单播还是组播||->CreateMulticastNotifier||->CreateConditionNotifier // 先只看单播||->ConditionNotifier::Instance

创建Receiver,同样也是继承于Endpoint,根据mode去创建对应的Receiver,但是这里创建的时候会带一个msg_listener callback,将msg_listener 注册到对应的Receiver中去。主要就是向diapatcher添加监听器,绑定回调函数,将自己的OnNewMessage函数注册到Dispatcher。这里用到了qt中信号和槽的设计理念。

Transport::CreateReceiver||->switch (mode)||->IntraReceiver ||->ShmReceiver //继承关系ShmReceiver->Receiver->Endpoint||->ShmReceiver::ShmReceiver // 构造里new了ShmDispatcher,继承||->dispatcher_ = ShmDispatcher::Instance() ||->ShmDispatcher::ShmDispatcher||->ShmDispatcher::Init||->RtpsReceiver||->HybridReceiver||->Enable // 调用具体派生类的Enable,这里HybridTransmitter不会触发Enable| |->ShmReceiver::Enable // 这里先只看shm的Enable,这里主要就是向diapatcher添加监听器,绑定回调函数| // 将自己的OnNewMessage函数注册到Dispatcher|->dispatcher_->AddListener(this->attr_, std::bind(&ShmReceiver::OnNewMessage, ...)); // dispatcher_是在ShmReceiver构造里创建| // 这里OnNewMessage里就是去调用一下自己的函数指针成员msg_listener|->handler->Connect(self_attr.id(), listener); // 这里用到了qt里信号和槽的概念,就是将listener绑定

推荐阅读
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • 开发笔记:图像识别基于主成分分析算法实现人脸二维码识别
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了图像识别基于主成分分析算法实现人脸二维码识别相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 时域|波形_语音处理基于matlab GUI音频数据处理含Matlab源码 1734期
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了语音处理基于matlabGUI音频数据处理含Matlab源码1734期相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 【图像边缘检测】基于matlab GUI Sobel+Prewitt+Robert算子图像边缘检测【含Matlab源码 203期】
    一、获取代码方式获取代码方式1:完整代码已上传我的资源:【图像边缘检测】基于matlabGUISobelPrewittRobert算子图像边缘检测【含 ... [详细]
  • 作者一直强调的一个概念叫做oneloopperthread,撇开多线程不谈,本篇博文将学习,怎么将传统的IO复用pollepoll封装到C++类中。1.IO复用复习使用p ... [详细]
  • 前一篇文章中,我们大致的讲述了一下JavaScriptCore这个库在iOS开发中的应用。在文中最后的阶段,我们提到了简单的来说,在最开始的UIWebView时,原生跟JS之间的交互一般是两种方式:当然这个其实也就是 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • IB 物理真题解析:比潜热、理想气体的应用
    本文是对2017年IB物理试卷paper 2中一道涉及比潜热、理想气体和功率的大题进行解析。题目涉及液氧蒸发成氧气的过程,讲解了液氧和氧气分子的结构以及蒸发后分子之间的作用力变化。同时,文章也给出了解题技巧,建议根据得分点的数量来合理分配答题时间。最后,文章提供了答案解析,标注了每个得分点的位置。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 在IDEA中运行CAS服务器的配置方法
    本文介绍了在IDEA中运行CAS服务器的配置方法,包括下载CAS模板Overlay Template、解压并添加项目、配置tomcat、运行CAS服务器等步骤。通过本文的指导,读者可以轻松在IDEA中进行CAS服务器的运行和配置。 ... [详细]
author-avatar
佳人蔚虹的小资心情_396
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有