一、主程序大致流程
1、入口文件为 skynet_main.c
2、初始化节点的全局信息,用线程存储的方式。(每个线程可以在其中存储自己的信息)
3、初始化 全局环境表,此表主要用来存储一些全局的配制信息
4、设置 忽略SIGPIPE信号,原因见:
http://www.cnblogs.com/caosiyang/archive/2012/07/19/2599071.html
5、读lua配置表初始化全局配置表
6、初始化节点信息
7、初始化全局消息队列
8、初始化模块
9、初始化定时器
10、初始化 socket 模块
11、开启第一个服务(引导入口的服务,比如exampel中的main.lua)
12、分配 3 + 配置线程数的 线程(监视器线程+定时器线程+socket服务线程+工作线程)
13、等待所有线程结束
14、清理监视器
16、清理socket
二、监视器线程工作
1、在启动线程服务的时候给每个线程创建了一个监视器
2、然后每当工作线程分发任务给服务的回调函数钱,设置监视器
3、如果出现服务死循环,那么就会被监视器检测到,并会将服务会强制结束这个死循环(目前还没明白这个原理)
三、定时器线程工作
1、以 0.025 秒为间隔,更新一次时间
更新时间的方式为,用当前的时间减去上次记录的时间,然后发送相差的时间间隔数目的定时器事件出去。
(具体怎么做还有待深究)
2、唤醒睡眠的工作线程去查看是否有事件可处理,如果工作线程发现没事干,还是会继续睡眠
四、Socket服务线程工作
1、不断从epoll 消息队列中拿出时间,让后分发给出去。
2、如果发现当前所有工作线程睡眠就会唤醒一个线程开始工作。
五、工作线程工作
1、从全局消息队列中取出一个消息消息队列,获得消息的目的服务标识
2、用工作队列的对应监视器设置当前监视状态(为了防止服务死循环)
3、拿出目的服务的环境句柄,然后从消息队列中取出一条消息调用服务的回调函数并将消息传递给它。
4、清空监视器的状态。
六、消息队列工作方式:
1、每个服务都有自己的消息队列,当有服务有消息到来的时候,先将消息压入服务自己的消息队列中。
2、把压入新消息的消息服务消息队列压入,全局的消息队列的队列中。
3、工作线程会不断的从全局消息队列中弹出 各个服务压入的各自的消息队列。
4、然后工作线程用弹出的服务消息队列,弹出一个消息,并用服务的回调函数处理消息
待续。。。。。。。