1 . 创建事件 (event_new)
主要完成event的空间分配,
struct event * event_new(struct event_base *base,
evutil_socket_t fd,
void (*cb)(evutil_socket_t, short, void *),
void *arg)
{
struct event *ev;
// 分配new event的空间
ev = mm_malloc(sizeof(struct event));
...
// event的参数赋值
ev->ev_base = base; // 依附的event_base
ev->ev_callback = callback; // 设置回调函数
ev->ev_arg = arg;
ev->ev_fd = fd;
ev->ev_events = events; // 该event注册的事件类型
ev->ev_res = 0;
ev->ev_flags = EVLIST_INIT; // ev_flags设置为初始化
ev->ev_ncalls = 0; // 回调函数执行了0次
ev->ev_pncalls = NULL;
// 根据event的ev_events的值,设置event的关闭方式
if (events & EV_SIGNAL) {...}
else
{
if (events & EV_PERSIST) { // event为
evutil_timerclear(&ev->ev_io_timeout); // 清除超时设置
ev->ev_closure = EV_CLOSURE_PERSIST;
} else {
ev->ev_closure = EV_CLOSURE_NONE;
}
}
...
// 优先级设置为active queue的大小的中间值
ev->ev_pri = base->nactivequeues / 2;
...
return (ev);
}
2 . 事件设置
对event的设置主要通过三个函数完成:event_set()、event_base_set()、event_priority_set()。
event_set函数的实现与event_new的类似,对event结构体的各参数进行赋值。
void event_set(struct event *ev,
int fd,
short events,
void (*callback)(int, short, void *), // event的回调函数
void *arg) // 用户传递的参数
event_base_set函数完成event注册到其他的event_base,仅当event的状态为EVLIST_INIT(即只执行了event_new,但还没有event_add)时,才能将event注册到新的event_base。
int event_base_set(struct event_base *base, struct event *ev)
event_priority_set函数设置event的执行优先级,仅当event的状态不是EVLIST_ACTIVE,才能将event的优先级进行设置。
int event_priority_set(struct event *ev, int pri)