之前总结了redis的通讯流程,基本框架,epoll的封装等等,这次介绍下redis对于select模型的封装
1 | //select 模型 |
_rfds和_wfds是读写结合的副本,因为select调用后会将读写集合中未就绪的文件描述符清除,所以每次用_rfds和_wfds传入,就不用担心原读写集合描述符被清除
。
封装的基于select的初始化函数
1 | static int aeApiCreate(aeEventLoop *eventLoop) { |
函数将读写集合清零,并且将state回传给eventloop的apidata部分
。
内存回收功能
1 | //释放空间 |
封装的添加和删除事件
1 | //select 添加事件 |
添加事件函数将文件描述根据mask是读事件还是写事件放入不同的set
删除事件根据文件描述符mask是读事件还是写事件从不同的set中清除
下面是核心功能,事件派发
1 | //select 触发事件 |
先将读写集合中的内容copy的_rfds和_wfds中,分别传入select函数中,
这样select后返回的_rfds中只有就绪的读socket,_wfds中只有就绪的写socket,通过FD_ISSET判断读写事件之后放到eventloop的fire队列里。
基本的封装就是这个样子,select模型相对容易理解