当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

<b>libevent源码浅析(四)</b>[VC/C++编程]

赞助商链接



  本文“<b>libevent源码浅析(四)</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

近来方才一个项目自己用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;

 struct event_list eventqueue;
 struct timeval event_tv;

 struct min_heap timeheap;

 struct timeval tv_cache;
};

我们这里用select来说,其他的事件驱动器都类似.

我们来看,此中activequeues我们知道是表示激活的事件行列.这里libevent的处理是,select被唤醒后,调用 event_active办法,将此事件插入到activequeues行列中,这里这个行列的实现是用tail queue.然后libevent会履行event_process_active办法,从而从激活行列中,顺次履行所激活的事件.这里这个行列之所以是一个指针的指针,是因为,libevent中事件还分为优先级,这样每个优先级都有一个activequeues行列.

记下来我们再来看按时器的实现,libevent会在每次履行循环时,从优先级行列中取出来最小的那个时间,然后将它加入到select中,从而实现按时器.而在每次select超时退出后,libevent会从小到大取出超不时间(直到大于当前时间),每次和当前时间对比,假如已超时,则会从优先级行列中删除此节点,然后将此超时事件加入到激活行列中.

接下来我们来看相关代码.

int
event_base_loop(struct event_base *base, int flags)
{
..................................................

 timeout_correct(base, &tv);

 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);
}


  以上是“<b>libevent源码浅析(四)</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .