event_set()
-
void
-
event_set(struct event *ev, int fd, short events, //ev,事件指针,fd,事件需要绑定的文件描述符,events,时间类型,可以是EV_TIMEOUT,EV_READ等,
-
void (*callback)(int, short, void *), void *arg) //callback,事件被触发时的回调函数, arg,回调函数参数
-
{
-
/* Take the current base - caller needs to set the real base later */
-
ev->ev_base = current_base; //设定ev的eventbase为全局变量current_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; //设定事件的链表类型,事件的默认链表类型是EVLIST_INIT
-
ev->ev_ncalls = 0; //
-
ev->ev_pncalls = NULL; //pncalls指针指向ncalls
-
-
min_heap_elem_init(ev); //初始化ev在最小堆中的序号
-
-
/* by default, we put new events into the middle priority */
-
if(current_base)
-
ev->ev_pri = current_base->nactivequeues/2; //设定ev的默认优先级,指定current_base的活动队列的中间值为ev的默认优先级
-
}
event_set()函数是读创建的event进行初始化工作,
(1) 绑定ev到event_base
(2) 设定ev的回调函数与参数
(3) 设定ev绑定的文件描述符
(4) 设定时间类型(EV_TIEMOUT,EV_READ,EV_WRITE等)
(5) 初始化ev在最小堆中的默认序号为-1
(6) 设定ev的优先级
如果该事件是定时器事件或者超时事件,调用的分别是evtimer_set宏与timeout_set宏
-
#define evtimer_set(ev, cb, arg) event_set(ev, -1, 0, cb, arg)//初始化一个定时器事件
-
#define timeout_set(ev, cb, arg) event_set(ev, -1, 0, cb, arg)//初始化一个超时事件
两个宏实际调用的都是event_set(ev, -1 , 0 , cb, arg ) //-1,定时器事件和超时时间默认的文件描述符指定为-1,0,表示EV_TIMEOUT事件类型
如果该事件是IO事件,
-
event_set(&evfifo, socket, EV_READ, fifo_read, &evfifo); //Event-test.c第127行
fd设置的是文件描述符的Id,events设定是ev的类型
如果该事件是signal事件,
-
event_set(&signal_int, SIGINT, EV_SIGNAL|EV_PERSIST, signal_cb,
-
&signal_int)
fd设置的是信号名,上面指定的是中断信号SIGINT,事件类型是EV_SIGNAL|EV_PERSIST
event_base_set()
-
int //绑定base到ev,并设置ev的pri优先级
-
event_base_set(struct event_base *base, struct event *ev)
-
{
-
/* Only innocent events may be assigned to a different base */
-
if (ev->ev_flags != EVLIST_INIT) //ev_flags不是EVLIST_INIT,则返回
-
return (-1);
-
-
ev->ev_base = base;
-
ev->ev_pri = base->nactivequeues/2;
-
-
return (0);
-
}
event_base_set()函数是作为event_set()的补充,该函数重新设置ev绑定的eventbase与ev的优先级
如果是通过event_base_new()创建的base,需要先调用event_set()函数先初始化event,再调用event_base_new()重新设置ev绑定的新的base
在Signal-test.c文件中,就是采用这个步骤重新设置ev绑定到的eventbase
-
/* Initalize the event library */
-
struct event_base* base = event_base_new();
-
/* Initalize one event */
-
event_set(&signal_int, SIGINT, EV_SIGNAL|EV_PERSIST, signal_cb,
-
&signal_int);
-
event_base_set(base, &signal_int)
阅读(6899) | 评论(0) | 转发(0) |