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进行比较,确定事件是否超时
};