快速业务通道

libevent源码浅析(一)

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
 set */
int event_fdsz;
fd_set *event_readset_in;
fd_set *event_writeset_in;
fd_set *event_readset_out;
fd_set *event_writeset_out;
struct event **event_r_by_fd;
struct event **event_w_by_fd;
};

selectops也就是实现了eventop。它导出了select的接口。
const struct eventop selectops = {
"select",
select_init,
select_add,
select_del,
select_dispatch,
select_dealloc,
0 
};

我们再来看下几个重要的函数(其中省略了一些语句,只介绍重要的一些语句):

struct event_base *
event_base_new(void)
{
......................................
//前面就是一些初始化,最重要的部分是下面的这个for循环。在这里初始化事件驱动引擎。这里eventops是一个eventop数组,里面包含所有事件驱动引擎的接口(就像上面介绍的selectops结构)

for (i = 0; eventops[i] && !base->evbase; i++) {
base->evsel = eventops[i];
///下面调用初始化函数,返回每个事件引擎的全局数据结构
base->evbase = base->evsel->init(base);
}
..................................

/* allocate a single active event queue */
event_base_priority_init(base, 1);

return (base);
}

event_init将event_base_new返回的值付给一个全局的变量current_base

Java代码

struct event_base *
event_init(void)
{
struct event_base *base = event_base_new();

if (base != NULL)
current_base = base;

return (base);
}

event_add加一新的事件到当前事件引擎

int
event_add(struct event *ev, const struct timeval *tv)
{
///取得当前事件的一些有用的数据结构。
struct event_base *base = ev->ev_base;
const struct eventop *evsel = base->evsel;
void *evbase = base->evbase;
int res = 0;

/*
* prepare for timeout insertion further below, if we get a
* failure on any step, we should not change any state.
*/
if (tv != NULL && !(ev->ev_flags & EVLIST_TIMEOUT)) {
if (min_heap_reserve(&base->timeheap,
1 + min_heap_size(&base->timeheap)) == -1)
return (-1); /* ENOMEM == errno */
}

///这里调用evsel->add来加一事件到当前的事件引擎。
if ((ev->ev_events & (EV_READ|EV_WRITE|EV_SIGNAL)) &&
!(ev->ev_flags & (EVLIST_INSERTED|EVLIST_ACTIVE))) {
res = evsel->add(evbase, ev);
if (res != -1)
event_queue_insert(base, ev, EVLIST_INSERTED);
}

/*
* we should change the timout state only if the previous event
* addition succeeded.
*/
if (res != -1 && tv != NULL) {
struct timeval now;

/*
* we already reserved memory above for the case where we 
* are not replacing an exisiting timeout.
*/
//如果超时就先删除此事件。
if (ev->ev_flags & EVLIST_TIMEOUT)
event_queue_remove(base, ev, EVLIST_TIMEOUT);

/* Check if it is active due to a timeout. Rescheduling
* this timeout before the callback can be executed
* removes it from the active list. */
if ((ev->ev_flags & EVLIST_ACTIVE) &&
(ev->ev_res & EV_TIMEOUT)) {
/* See if we are just active executing this
* event in a lo

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号