前言
在这一小节里我们将接触到event.c源文件里面的一些关于设置event接口函数。这对我们了解event以及它和event_base之间的联系很有帮助。
event_set
首先我们看一看初始化event的操作:
void
event_set(struct event *ev, int fd, short events,
void (*callback)(int, short, void *), void *arg)
{
/* Take the current base - caller needs to set the real base later */
ev->ev_base = 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;
ev->ev_ncalls = 0;
ev->ev_pncalls = NULL;
min_heap_elem_init(ev);
/* by default, we put new events into the middle priority */
if(current_base)
ev->ev_pri = current_base->nactivequeues/2;
}
参数:
struct event *ev:需要进行初始化的eventint fd:事件的文件描述符/信号值short events:事件的类型void (*callback)(int, short, void *):回调函数指针。
int:回调函数第一个参数,对应当前事件的文件描述符/信号值,event->ev_fdshort:对应当前事件激活类型,event->ev_resvoid *:对应当前事件的ev_arg
void *arg:设置回调函数的第3个传入参数
代码分析:
这个函数做的无非就是将一个event设置好初始化的值。不过像链表这些变量还没被赋值,后面添加事件/删除事件才进行操作。可以看到:
ev->ev_base设置的值是current_base,它是一个全局变量。还记得event_init函数吗,里面有条语句是current_base = base;。ev->ev_flags一来设置的当前event状态是EVLIST_INITev->ev_ncalls以及ev->ev_res初始值为0min_heap_elem_init(ev);,这条语句的作用是初始化跟时间有关的成员,如min_heap_idxev->ev_pri = current_base->nactivequeues/2;,这条语句的作用就是设置初始优先级(nactivequeues成员代表一共有nactivequeues个不同的优先级)
event_base_set
int
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)
return (-1);
ev->ev_base = base;
ev->ev_pri = base->nactivequeues/2;
return (0);
}
参数:
struct event_base *base:事件ev准备注册到的event_basestruct event *ev:当前事件ev
代码分析:
从ev->ev_flags != EVLIST_INIT就退出可以看到,只有处于初始化状态的event才能被设置为准备注册到另一个event_base上。而在默认情况下,都是注册到current_base上的,在event_set函数中很清晰。
event_priority_set
int
event_priority_set(struct event *ev, int pri)
{
//如果当前事件已经处于激活状态了,则无法改变优先级了
if (ev->ev_flags & EVLIST_ACTIVE)
return (-1);
//如果传入的pri的大小不符合则退出(再次提醒,nactivequeues代表有多少种优先级,默认是1,从0开始计算)
if (pri < 0 || pri >= ev->ev_base->nactivequeues)
return (-1);
//设置优先级
ev->ev_pri = pri;
return (0);
}
参数:
struct event *ev:需要设置优先级的事件int pri:设置的优先级
源码分析:
这个函数只有两点需要注意:
- 当前事件如果已经激活,则无法改变优先级
nactivequeues的初始化值为1,即只有一种优先级0级。在event_base_new函数中调用
小结
需要注意的一点是将ev_base设置了值并不代表event就被注册在该ev_base上了,而是有专门的注册函数。在了解了event各成员如何初始化之后,我们下一节将观察event是如何注册到ev_base上的,以及如何注销等操作。
2104



被折叠的 条评论
为什么被折叠?



