libevent源码浅析(四)2010-03-09 javaeye simohayha最近刚刚一个项目自己用libevent,因此这几天又把libevent的代码拿出来翻了下,当初看的时候有些似是而非的东西,这次是基本没有了。这篇也算是前面几篇libevent的blog的补充了。struct event_base { const struct eventop *evsel; void *evbase; int event_count; /* counts number of total events */ int event_count_active; /* counts number of active events */
int event_gotterm; /* Set to terminate loop */ int event_break; /* Set to terminate loop immediately */
/* active event management */ struct event_list **activequeues; int nactivequeues;
/* signal handling info */ struct evsignal_info sig;
tv_p = &tv; ///判断是否有激活事件,如果没有的话我们则会从优先级队列中取出最小的那个时间。也就是离现在最近的那个超时时间。 if (!base->event_count_active && !(flags & EVLOOP_NONBLOCK)) { ///下面会介绍这个函数 timeout_next(base, &tv_p); } else { /* * if we have active events, we just poll new events * without waiting. */ evutil_timerclear(&tv); }
......................................................... /* clear time cache */ base->tv_cache.tv_sec = 0; ///调用相关事件驱动引擎的dispatch方法,这个方法中会将已激活的事件加入到激活队列,这里看到tv_p也就是上面取到的超时时间被传入到dispatch。 res = evsel->dispatch(base, evbase, tv_p);
if (res == -1) return (-1); gettime(base, &base->tv_cache); ///处理超时事件,将所有已超时的事件加入到激活队列。下面我们会介绍这个函数 timeout_process(base);
if (base->event_count_active) { ///执行激活事件队列 event_process_active(base); if (!base->event_count_active && (flags & EVLOOP_ONCE)) ///判断是否退出。 done = 1; } else if (flags & EVLOOP_NONBLOCK) done = 1; }
/* clear time cache */ base->tv_cache.tv_sec = 0; event_debug(("%s: asked to terminate loop.", __func__)); return (0); }