概述
在使用libevent函数之前,首先需要调用其event_init函数进行初始化。
初始化过程主要是创建一个全局默认的current_base变量,其类型为
struct event_base。
struct event_base对象变量可由eventn_base_new()函数创建并初始化。
libevent中,部分函数默认直接操作全局current_base,部分相同功能函数
可特别指定由event_base_new()创建的其他struct event_base变量,如:
event_set()默认操作的全局current_base变量,
event_base_set()则操作指定的event_base变量。
event_init与event_base_new函数
该函数将调用event_base_new()函数,创建并初始化一个struct event_base对象,
并将该对象赋值给全局变量current_base,作为全局默认的event_base。
event_base_new()则用于创建一个新的event_base结构对象,并对其进行初始化。
初始化过程包括选择使用的IO事件模型,创建事件队列等。
event_base结构
struct event_base {
const struct eventop *evsel;
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 */
struct event_list **activequeues;
int nactivequeues;
struct evsignal_info sig;
struct event_list eventqueue;
struct timeval event_tv;
struct min_heap timeheap;
struct timeval tv_cache;
};
evsel: 当前使用的系统IO事件模型的抽象接口,event_base_new()函数会
按顺序检测可用的IO事件模型,该顺序为:
event ports, kqueue, epool, /dev/poll, poll, select.
evbase: evsel->init()的执行结果。在event_base_new()中,使用evsel->init()
的返回值判断特定的IO事件模型是否可用。(返回NULL则不可用)
event_count: 当前event base中包含的事件数。
event_count_active: 当前event base中活动的事件数。
activequeues: 活动事件的队列。
nactivequeues: activequeues的长度
eventqueue: 当前event base中包含所有event的列表。
event_tv: 在event_base_new中,设置为当前时间。
timeheap: libevent库使用一个最小堆结构,保存各个事件的超时时间,
从而可以优化超时判断的性能。
来源:oschina
链接:https://my.oschina.net/u/1014977/blog/202513