Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4078512
  • 博文数量: 251
  • 博客积分: 11197
  • 博客等级: 上将
  • 技术积分: 6862
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-05 14:41
个人简介

@HUST张友东 work@taobao zyd_com@126.com

文章分类

全部博文(251)

文章存档

2014年(10)

2013年(20)

2012年(22)

2011年(74)

2010年(98)

2009年(27)

分类: LINUX

2011-06-07 20:50:43

libevent提供一种当特定事件发生、超时或信号到达时执行回调函数的机制,看了libevent的代码,里面包含了对普通事件、超时事件的处理;libevent-0.12000年发布)使用select来进行IO轮询,最新的libevent版本使用epoll。(

 

libevent的实现框架(三个主体 事件、队列、处理):

l  事件,每个事件由一个struct event标示;

   struct event {

              // 事件所处队列的链接指针

              TAILQ_ENTRY (event) ev_read_next;

              TAILQ_ENTRY (event) ev_write_next;

              TAILQ_ENTRY (event) ev_timeout_next;

              TAILQ_ENTRY (event) ev_add_next;

 

              int ev_fd;   // 与事件关联的文件描述符

              short ev_events;  // 事件类型

 

              struct timeval ev_timeout;  // 事件超时时间

 

              void (*ev_callback)(int, short, void *arg); // 时间达到时的回调函数

              void *ev_arg;  // 回调函数的参数

 

              int ev_flags;  // 事件所在的队列标志

};

 

l  队列

libevent定义了四种类型的队列(tail queue

TAILQ_HEAD (timeout_list, event) timequeue;  // 超时队列

TAILQ_HEAD (event_wlist, event) writequeue;  // 写等待队列

TAILQ_HEAD (event_rlist, event) readqueue;   // 读等待队列

TAILQ_HEAD (event_ilist, event) addqueue;    // 添加队列

 

其中,超时队列中包含有超时时间限制的事件;添加队列中的时间为需要延时加入的事件(在调用event_add时,正在进行事件派遣event_dispatch,这些事件要等本轮派遣结束才能加入)。

 

libevent提供了event_set接口来构造事件;event_add接口来往相应的队列中添加事件(同一个fd上的多个事件只需要构造一个event,并指明事件类型,event_add会将事件添加到相应的队列中); event_del来从响应的队列删除事件。

 

l  处理(派遣)

libevent提供event_dispatch接口来派遣等待的事件。event_dispatch首先遍历各个等待队列,将时间对应的描述符和事件类型加入selectfdset,然后选择超时时间最近的的事件(超时队列中的事件在插入时是按超时时间排序的,新的libevent使用堆),根据差值设置select的超时时间。select返回后,再次遍历各个队列中的事件,如果事件(或超时时间)已到达,则执行回调函数。处理完后,将addqueue中的事件加入到相应的队列中去,然后执行下一轮派遣处理。

 

阅读(5148) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

zyd_cu2011-06-09 15:31:18

yifangyou: 挺好,libevent的中文资料挺少的,网上的资料都是抄来抄去,支持原创.....
呵呵,谢谢支持。

yifangyou2011-06-09 11:33:34

挺好,libevent的中文资料挺少的,网上的资料都是抄来抄去,支持原创