LoopJump's Blog

Cwinux源码解析6

2014-01-10

之前Cwinux相关博文能得到Cwinux作者的认可,好高兴,撒花庆祝。

本文是对Cwinux源码解析(四)和(五)的进一步补充。

在Cwinux源码解析(四)(五)中,我们分析了Reactor模式和Cwinux中的具体实现。

现在先回顾一下。

如图示:

msg_process.png

该图相比源码解析(四)的第一张图增加了异步Task部分。这部分是从文档中读到,未读这部分代码。

我们再一次重复描述一下消息处理流程:Cwinux通信层从网络连接对应的文件描述符fd上读取到数据,然后框架将数据封装为消息,并通知用户app有消息到达(例如,EchoApp::onRecvMsg函数会被调用)。用户app将该消息投入到初始化时创建的线程池。线程池通过Commander模式运行,不断地从消息队列(隶属于线程的消息队列)中读取消息并处理。

通信层的Reactor模式代码和线程池中Commander模式代码的关系是:Reactor模式读取网络连接字节流并封装为Cwinux的消息对象,Commander模式处理消息。我一开始读代码时遇到的一个问题就是没理清楚这个两层关系,所以走了些弯路,请读者注意避免。该层次关系如图示:

2layer.png

如前所述,通信层发生的事件不只是有数据到来,还可能是网络连接异常等事件。即使是数据到来,不见得就是Cwinux中定义的消息对应的字节流(与建立连接时设置的模式参数有关)。在源码解析(五)中我们解释了CwxAppHandler4Base和CwxAppHandler4Msg两个类。其余的几个类及其关系图如下。

msg_reactor.png

从图中可以看出,除了处理消息外,信号,IO其他事件,新连接进入等事件都是在Reactor模式相关代码中处理的。

扫描二维码,分享此文章