libevent源码分析(2)--初始化

来源:互联网 发布:手机最火软件 编辑:程序博客网 时间:2024/06/06 08:47

上面一篇文章介绍了几个比较重要的数据结构。。。接下来来看看libevent的初始化吧。。。

首先我们一般会先调用event_init函数,那就先从它开始吧:

struct event_base *event_init(void){struct event_base *base = event_base_new();if (base != NULL)current_base = base;  //currentbaseÖ¸Ïò¸Ãbasereturn (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的初始化貌似就差不多了吧。。貌似真简单。。。

原创粉丝点击