事件处理器由event_new函数来创建,evsignal_new是event_new的特化版本(是事件为EV_SIGNAL|EV_PERSIST的event_new函数调用),event_new定义如下:
// 新建一个事件处理器
struct event *
event_new(struct event_base *base, evutil_socket_t fd, short events, void (*cb)(evutil_socket_t, short, void *), void *arg)
{
// 内存分配
struct event *ev;
ev = mm_malloc(sizeof(struct event));
if (ev == NULL)
return (NULL);
// 事件处理器赋值
if (event_assign(ev, base, fd, events, cb, arg) < 0) {
mm_free(ev);
return (NULL);
}
return (ev);
}
event_assign函数的定义如下:
// 事件处理器赋值
int
event_assign(struct event *ev, struct event_base *base, evutil_socket_t fd, short events, void (*callback)(evutil_socket_t, short, void *), void *arg)
{
if (!base)
base = current_base;
_event_debug_assert_not_added(ev);
// 一些字段的赋值
ev->ev_base = base;
ev->ev_callback = callback;
ev->ev_arg = arg;
ev->ev_fd = fd;
ev->ev_events = events; // 事件处理处理的事件
ev->ev_res = 0;
ev->ev_flags = EVLIST_INIT;
ev->ev_ncalls = 0;
ev->ev_pncalls = NULL;
// 如果是信号处理器
if (events & EV_SIGNAL)
{
// 信号不适应用于读写事件
if ((events & (EV_READ|EV_WRITE)) != 0)
{
event_warnx("%s: EV_SIGNAL is not compatible with "
"EV_READ or EV_WRITE", __func__);
return -1;
}
// ev_closure指定event_base执行事件处理器的回调函数时候的行为
ev->ev_closure = EV_CLOSURE_SIGNAL;
}
else
{
// 普通io事件或者定时器事件
// 如果是永久事件
if (events & EV_PERSIST)
{
evutil_timerclear(&ev->ev_io_timeout);
ev->ev_closure = EV_CLOSURE_PERSIST;
}
else
{
ev->ev_closure = EV_CLOSURE_NONE;
}
}
// 初始化小根堆的元素
min_heap_elem_init(ev);
// 设置信号处理器的优先级
if (base != NULL)
{
/* by default, we put new events into the middle priority */
ev->ev_pri = base->nactivequeues / 2;
}
_event_debug_note_setup(ev);
return 0;
}