上面一篇文章介绍了几个比较重要的数据结构。。。接下来来看看libevent的初始化吧。。。
首先我们一般会先调用event_init函数,那就先从它开始吧:
struct event_base *
event_init(void)
{
struct event_base *base = event_base_new();
if (base != NULL)
current_base = base; //currentbaseÖ¸Ïò¸Ãbase
return (base);
}
其实还是很简单的,就是创建一个event_base的结构,这里可以看到一个变量current_base,它是一个默认的base,当没有指明的时候,默认使用它。。。。接下来来看event_base_new函数吧:struct event_base *
event_base_new(void)
{
int i;
struct event_base *base;
if ((base = calloc(1, sizeof(struct event_base))) == NULL) //创建base结构
event_err(1, "%s: calloc", __func__);
detect_monotonic();
gettime(base, &base->event_tv);
min_heap_ctor(&base->timeheap); //堆的初始化
TAILQ_INIT(&base->eventqueue); //事件队列初始化
base->sig.ev_signal_pair[0] = -1;
base->sig.ev_signal_pair[1] = -1;
base->evbase = NULL;
for (i = 0; eventops[i] && !base->evbase; i++) {
base->evsel = eventops[i]; //这个数组中保存了所有具体的模块定义的操作
base->evbase = base->evsel->init(base); //具体操作的绑定,例如epoll的函数
}
if (base->evbase == NULL)
event_errx(1, "%s: no event mechanism available", __func__);
if (evutil_getenv("EVENT_SHOW_METHOD"))
event_msgx("libevent using: %s\n",
base->evsel->name);
/* allocate a single active event queue */
event_base_priority_init(base, 1); //初始化激活事件优先级队列
return (base);
}
其实还是很简单的吧,就是构造base结构,并进行一些初始化工作,例如绑定具体的事件驱动函数,因为底层有好几种事件的实现,所以需要选出一种具体的来用。。。另外还有一些与信号相关的内容,以及事件队列的初始化等。。。
好了,libevent的初始化貌似就差不多了吧。。貌似真简单。。。