libev学习笔记(一)——主要数据结构

转自 http://blog.youkuaiyun.com/ababybear/article/details/40991987

1.EV_P, EV_P_ ,EV_A, EV_A_

1.1声明

[cpp]  view plain  copy
  1. # define EV_P  struct ev_loop *loop  
  2. # define EV_P_ EV_P,  
  3. # define EV_A  loop  
  4. # define EV_A_ EV_A,  

1.2说明

这几个宏定义比较奇葩,其实就是用EV_P表示一个ev_loop*的声明,用EV_P_来表示一个ev_loop*后面带一个逗号“,”的声明。例如:

[cpp]  view plain  copy
  1. void func(EV_P_ int a);  

等价于

[cpp]  view plain  copy
  1. void func(struct ev_loop*loop, int a);  

我不怎么理解这种写法有什么好处,如果硬要扯一个理由的话就是后面的代码会显得比较简练,不会没定义一个函数都有一大串参数列表。

但是这也带来了一个很大的麻烦,就是阅读源代码变得十分不方便,特别是想我这种新手,看的妈都不认识了~

 

2.ev_loop

2.1声明

[cpp]  view plain  copy
  1. struct ev_loop  
  2. {  
  3.   ev_tstamp ev_rt_now;  
  4.   #define ev_rt_now ((loop)->ev_rt_now)  
  5.   #define VAR(name,decl) decl;  
  6.     #include"ev_vars.h"  
  7.   #undef VAR  
  8. };  
  9. #include"ev_wrap.h"  

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声明

[cpp]  view plain  copy
  1. #define EV_WATCHER(type)                      \  
  2.   int active; /* private */                           \  
  3.   int pending; /* private */                       \  
  4.   EV_DECL_PRIORITY /* private */                 \  
  5.   EV_COMMON/* rw */                                    \  
  6.   EV_CB_DECLARE (type) /* private */  

3.2解析

[cpp]  view plain  copy
  1. struct ev_watcher{  
  2.     int active; //监视器是否启动  
  3.     int pending;      //监视器是否被触发  
  4.     int priority;       //优先级  
  5.     void * data;      //存放调用者自定义的数据,在libev架构中不被使用  
  6.     void (*cb) (EV_P_ structtype * io, int revent);        //回调函数,被触发是调用  
  7. }  

3.3作用

WATCHER是libev中所有监听器的基类,在这里作者使用了面向对象中继承的思想,将监视器从各种类别监视器中抽象出来,并且在后面调用过程中,这些参数都是私有的。

WATCHER中定义了监控监视器状态的参数和优先级等基本参数。同时也绑定了回调函数,但是并没有涉及具体的触发条件,因为各种监视器的触发条件有所不同,所有触发条件在各类监视器的具体实现中体现。

 

4.EV_WATCHER_LIST

4.1声明

[cpp]  view plain  copy
  1. #defineEV_WATCHER_LIST(type)                      \  
  2.   EV_WATCHER (type)                                \  
  3.   struct ev_watcher_list *next; /* private */  
  4.    
  5. typedef struct ev_watcher_list  
  6. {  
  7.   EV_WATCHER_LIST (ev_watcher_list)  
  8. } ev_watcher_list;  


4.2说明

Ev_watcher_list就是基于watcher的简单单向链表实现,因为有部分watcher允许有多个同类型watcher同时存在,所以使用链表来组织这些watcher。

在后面的框架代码中,我们可以看到以下几个定义

[cpp]  view plain  copy
  1. typedef ev_watcher *W;  
  2. typedef ev_watcher_list*WL;  
  3. typedef ev_watcher_time*WT;  


这几个是我们在代码中最常用到的数据结构的重新定义(这里用了很多缩写还有嵌套定义,应该是为了后面代码的简历,但是编写增加了阅读源码的难度)。

 

5.EV_WATCHER_TIME

5.1声明

[cpp]  view plain  copy
  1. #defineEV_WATCHER_TIME(type)                   \  
  2.   EV_WATCHER (type)                                \  
  3.   ev_tstamp at;  
  4.    
  5. typedef struct ev_watcher_time  
  6. {  
  7.   EV_WATCHER_TIME (ev_watcher_time)  
  8. } ev_watcher_time;  

5.2说明

ev_watcher_time在ev_watcher的基础上增加了一个字段at,这里at保存了触发该watcher的时间。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值