ae是一个Redis实现的事件库,为什么叫ae,如下

image.png
1553501010670582.png

一个事件库,又是Redis喜欢的命名方式,那么我们干脆也称其为ae事件库。

这个事件库非常的小巧并且精致,为什么这么说呢,因为它几乎毫无外部依赖,完全原生的实现,对于不同的系统IO多路复用都有一套最高效的实现:对于Solaris平台使用evport、Linux平台使用epoll、FreeBSD平台使用kqueue、最后如果是其他平台则用select,整个库的耦合程度与函数设计也完全是范式级别,绝对是小巧事件库的典范。

Redis的设计者估计也是对libevent这样的尴尬事件库不感冒,干脆自己设计一个,不得不承认那位意大利人的水平之高,这个事件库的设计得确实很恰当与合理,下面正式开始,我大部分会采取直接在源码中注释的方式,便于阅读。


基本结构和方法的原型声明与定义(ae.h)

image.png
1553503600965323.png

一些状态标志位、返回值的宏定义

image.png
1553503712751764.png

四个基本方法,个人感觉这四个方法不适合翻译成中文表达,尤其是最后一个BeforeSleep方法,他的作用是在事件循环中,在每次开始处理事件前“睡眠”一会,执行一些前置事务,然后才开始事件处理,如果翻译的话难不成翻译成先睡一会方法?所以就都不翻译,只要把这四个方法与文件事件、时间事件、事件时间完成后的清理工作、前置事务一一对应起来即可。

image.png
1553504360634364.png

文件事件与时间时间结构的定义,其中时间事件的when_sec与when_ms字段表明事件执行的绝对时间,也就是Unix时间戳,精确到毫秒级别。从时间事件的next指针就能看出来,时间时间用链表串联,别的在这就先不多说。

image.png
1553504768896934.png

一个被激活的文件时间,指定对应的文件描述符与可读或可写标志位。此处的Fired确实会让人纳闷,因为很多人可能不查不会知道fire有类似激活的意思~

image.png
1553504871724336.png

事件循环的组成,其中一些字段所起的作用我们在具体的方法中再去细细探究。

image.png
1553505157423865.png

所有方法的声明

事件循环本身的方法:创建一个事件循环、删除一个事件循环、终止某个事件循环、处理事件;

文件事件的方法:创建一个文件事件、删除一个文件事件、获取某个文件事件、获取事件循环中的最大文件描述符限制、重置事件循环中最大文件描述符限制;

时间事件的方法:创建一个时间事件、删除一个时间事件