作者:佳人蔚虹的小资心情_396 | 来源:互联网 | 2023-09-09 16:37
近期一直在阅读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绑定