event的回调函数定义及event结构和event_base结构中各个成员的描述

来源:互联网 发布:mysql 查看binlog 编辑:程序博客网 时间:2024/06/09 14:58

libevent实现了网络IO,timer,signal的事件触发机制. 可以很方便的应用于event-driven服务器中,作为其底层事件处理模块. 比较成功的案

例有 memcache(分布式缓存), PLB(负载均衡器)等.

 
1. 回调函数定义
void (*ev_callback)(int, short, void *arg);

这个回调函数的参数的意思为:
参数1: 表示触发事件的文件句柄,比如一个socket对象.
参数2: 表示事件发生的结果,可能是超时、可读、可写.
参数3: 表示传递给事件的参数.

2. event的结构描述
struct event {
 TAILQ_ENTRY (event) ev_next;            /*增加下一个事件*/
 TAILQ_ENTRY (event) ev_active_next;     /*增加下一个活动事件*/
 TAILQ_ENTRY (event) ev_signal_next;     /*增加下一个信号*/
 unsigned int min_heap_idx;         /* for managing timeouts 表示该event保存在min_heap数组中的索引*/

 struct event_base *ev_base;             /* 一个全局变量,管理着事件,如事件总数,事件列表*/

 int ev_fd;               /*文件描述符,比如一个socket*/
 short ev_events;        /*该事件的触发信号,如EV_READ|EV_WRITE
 short ev_ncalls;        /*触发该事件后的调用次数*/
 short *ev_pncalls; /* Allows deletes in callback */

 struct timeval ev_timeout;   //用来保存事件的超时时间

 int ev_pri;  /* smaller numbers are higher priority */

 void (*ev_callback)(int, short, void *arg);   /*事件的回调函数*/
 void *ev_arg; /*回调函数的参数*/

 int ev_res;  /* result passed to event callback */
 /*事件的使用过程定义,
         1. 初始化(EVLIST_INIT,在event_set中设置)
         2. 加入到事件列表(EVLIST_INSERTED,在event_add中设置,
            如果使用event_add时指定超时事件,则同时使用EVLIST_TIMEOUT标志把该事件加入到超时事件列表)
         3. 事件活动(EVLIST_ACTIVE,在event_active中设置)
  */

 int ev_flags;          
};

3. event_base 的结构描述

event_base 定义在event-internal.h文件中

struct event_base {
 const struct eventop *evsel;      //表示选择的事件引擎,可能为:epoll, poll, select
 void *evbase;                     //全局对象
 int event_count;   /* counts number of total events */
 int event_count_active; /* counts number of active events */

 int event_gotterm;  /* Set to terminate loop */
 int event_break;  /* Set to terminate loop immediately */

 /* active event management */
 struct event_list **activequeues;
 int nactivequeues;

 /* signal handling info */
 struct evsignal_info sig;

 struct event_list eventqueue;
 struct timeval event_tv;        //系统的当前时间

 struct min_heap timeheap;  //用来检测事件是否超时的堆栈

 struct timeval tv_cache;   //与event::ev_timeout进行比较,确定事件是否超时
};