在使用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_base_new()函数,建立并初始化一个struct event_base对象,
并将该对象赋值给全局变量current_base,做为全局默认的event_base。oop
event_base_new()则用于建立一个新的event_base结构对象,并对其进行初始化。
初始化过程包括选择使用的IO事件模型,建立事件队列等。
性能
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库使用一个最小堆结构,保存各个事件的超时时间,
从而能够优化超时判断的性能。优化