用户通过调用CreateNode
函数创造一个节点,该函数是在节点类Node的友元函数。
Nodel类的成员变量·node_channel_impl(NodeChannellmpl)负责创建Reader和Writer。
Writer类中包含transmitter_ , change_conn_, channel_manager_,及JoinTheTopology
函数。
Writer类在初始化过程中会调用函数transport::Transport::Instance()->CreateTransmitter<MessageT>(role_attr_)
为transmitter_,默认情况下是OptionalMode::HYBRID
混合通信,但本次分析主要以OptionalMode::SHM
进程间通信为主。
在生成一个SHM形式的Transmitter后,会调用transmitter->Enable()
,初始化这个Transmitter。Transmitter类主要含有成员变量segment_和 notifier_ ,Transmitter使能的过程就是为segment_和 notifier_赋值的过程,Segment类负责管理共享内存。notifier_最终会指向一个ConditionNotifier或MulticastNotifier。
对于ConditionNotifier,它包含一个Indicator结构体,Indicator包含ReadableInfo数组和一个条件变量,Indicator会在另一块共享内存中。写进程通过Indicator中的条件变量通知读进程有数据到达。读进程得到通知后会读取Indicator中的某个ReadableInfo,然后根据此ReadableInfo信息从Segment管理的内存中获取数据。
channel_manager_会被赋值channel_manager_ = service_discovery::TopologyManager::Instance()->channel_manager()
负责管理channel,每创建一个Writer或Reader都会生成一个channel。
在函数JoinTheTopology
中负责拓扑网络的管理
Shmdispatcher类中有一个单独进程ThreadFunc()负责监听消息,OnMessage会触发DatatDispatcher从公共内存中读取消息并放置于DataVisitor,每个DataVisitor都对应一个CRoutine,而明每个CRoutine都会封装一个用户回调函数。
Processor中的Run()函数会循环执行,每次选择一个CRoutine进行执行。
协程之间的切换主要之上下文切换,ctx_swap函数实现上下文的切换,主要做两点工作:保存当前寄存器信息、替换函数返回地址。实际上当返回地址改变时,当函数返回时,接下来执行的指令也就转移了。