event_int(初始化libevent实例)
struct event_base *
event_init(void)
初始化事件处理框架实例,内部调用event_base_new。
event_base_new的主要逻辑:
代码
1 struct event_base *
2 event_base_new(void)
3 {
4
5 //初始化小根堆
6 min_heap_ctor(&base->timeheap);
7
8 //初始化注册事件队列
9 TAILQ_INIT(&base->eventqueue);
10
11 for (i = 0; eventops[i] && !base->evbase; i++) {
12 //I/O demultiplex机制实例
13 base->evsel = eventops[i];
14
15 //初始化I/O demultiplex实例(参见win32_init)
16 base->evbase = base->evsel->init(base);
17 }
18
19 //分配1个就绪事件队列
20 event_base_priority_init(base, 1);
21
22 }
event_add(注册事件)
//注册事件
int
event_add(struct event *ev, const struct timeval *tv)
该函数主要将事件ev加入到事件框架event_base的注册事件链表base->eventqueue。
vent_del(删除事件)
//删除事件
int
event_del(struct event *ev)
该函数主要将事件ev从相应的链表上删除。
event_set(设置事件)
代码
/*设置event对象
**ev:事件对象
**fd:事件对应的文件描述符或信号,对于定时器设为-1
**events:事件类型,比如 EV_READ,EV_PERSIST, EV_WRITE, EV_SIGNAL
**callback:事件的回调函数
**arg:回调函数参数
*/
void
event_set(struct event *ev, int fd, short events,
void (*callback)(int, short, void *), void *arg)
在将事件注册事件处理框架之前,应该先调用event_set对事件进行相关设置。
libevent对event的管理
event结构有3个链表结点域和一个小根堆索引,libevent通过3个链表和一个小根堆对I/O事件、signal事件和timer事件进行管理。
对于I/O事件,通过event_add将其加入event_base的注册事件链表eventqueue ;就绪时会加入event_base的就绪链表activequeues[];
对于timer事件,event_add将其加入到event_base的小根堆timeheap;
Signale事件的管理相对复杂些,event_add将其加入到注册事件链表,同时,event_add内部会调用I/O demultiplex的add函数(对于I/O事件也一样),比如epoll_add。而add函数又会调用evsignal_add将其加入到evsignal_info的evsigevents[signo]链表(关于signal,后面会详细介绍)。