转自 http://blog.youkuaiyun.com/ababybear/article/details/40991987
1.EV_P, EV_P_ ,EV_A, EV_A_
1.1声明
1.2说明
这几个宏定义比较奇葩,其实就是用EV_P表示一个ev_loop*的声明,用EV_P_来表示一个ev_loop*后面带一个逗号“,”的声明。例如:
等价于
我不怎么理解这种写法有什么好处,如果硬要扯一个理由的话就是后面的代码会显得比较简练,不会没定义一个函数都有一大串参数列表。
但是这也带来了一个很大的麻烦,就是阅读源代码变得十分不方便,特别是想我这种新手,看的妈都不认识了~
2.ev_loop
2.1声明
2.2说明
有人说libev最恶心也是最精妙的就是它那一堆宏,其中对于ev_loop的声明中应该就可以看出来。ev_loop顾名思义,就是libev保存watcher以及各种参数的主循环,所有的watcher都是挂在这个数据结构上面,所以他的规模也是相当大。但是在上面的声明中,我们看到貌似也不是很长。其中的关键就在于#include “ev_vars.h”这里。Ev_vars.h头文件保存了ev_loop所有可能用到的成员变量的宏定义,在这里include这个文件,就相对于把这些成员引进到ev_loop中。
同时这里有一个很巧妙的地方,也是我们在项目中经常可以用到的。就是在不同的环境下,ev_loop所需要的成员变量不尽相同,所以通过宏的方式来声明成员,我们就可以跳过不必要的成员,从而保证在各种环境下ev_loop尽量简洁。
ev_loop具体字段的含义以后会再讨论。
3.EV_WATCHER
3.1声明
3.2解析
3.3作用
WATCHER是libev中所有监听器的基类,在这里作者使用了面向对象中继承的思想,将监视器从各种类别监视器中抽象出来,并且在后面调用过程中,这些参数都是私有的。
WATCHER中定义了监控监视器状态的参数和优先级等基本参数。同时也绑定了回调函数,但是并没有涉及具体的触发条件,因为各种监视器的触发条件有所不同,所有触发条件在各类监视器的具体实现中体现。
4.EV_WATCHER_LIST
4.1声明
4.2说明
Ev_watcher_list就是基于watcher的简单单向链表实现,因为有部分watcher允许有多个同类型watcher同时存在,所以使用链表来组织这些watcher。
在后面的框架代码中,我们可以看到以下几个定义
这几个是我们在代码中最常用到的数据结构的重新定义(这里用了很多缩写还有嵌套定义,应该是为了后面代码的简历,但是编写增加了阅读源码的难度)。
5.EV_WATCHER_TIME
5.1声明
5.2说明
ev_watcher_time在ev_watcher的基础上增加了一个字段at,这里at保存了触发该watcher的时间。