libevent源代码分析--event_dispatch() (一)

本文深入剖析libevent库的event_dispatch函数,该函数在用户自定义的event_base上运行,类似于I/O复用机制的循环。通过分析event_base_loop,我们发现其核心是处理event_base中的事件。文章详细解读了如何找到event_base的evsel,循环中的退出条件,以及如何确定系统调用的等待事件。关键函数timeout_next用于获取堆中最小的时间事件,而event_process_active则处理激活的信号和I/O事件,timeout_process处理定时器事件。真正的业务逻辑主要集中在event_process_active中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

event_dispatch这个函数是以上所有处理都结束以后,最后的一个借口调用,其实和这个函数类似的函数有好几个,接下来一一分析。

int
 405 event_dispatch(void)
 406 {
 407     return (event_loop(0));
 408 }
可以返现event_dispatch只有一个调用event_loop(),
但是event_loop函数的调用呢

int
 467 event_loop(int flags)
 468 {
 469     return event_base_loop(current_base, flags);
 470 }
 471 
event_loop的调用也是嵌套了一个函数,event_base_loop,那么我们看看这个event_base_loop函数总共被几个函数所调用

int
 411 event_base_dispatch(struct event_base *event_base)
 412 {
 413   return (event_base_loop(event_base, 0));
 414 }
其实最终的调用都是event_base_loop函数,但是不同之处就是传递的第一个参数,这个参数决定了event术语那个event_base,如果使用默认的情况就是current_base,如果是

用户自己的event_base就使用eventbase_diapatch函数。下面分析event_base_loop函数:

int
 473 event_base_loop(struct event_base *base, int flags)
 474 {
 475     const struct eventop *evsel = base->evsel;
 476     void *evbase = base->evbase;
 477     struct timeval tv;
 478     struct timeval *tv_p;
 479     int res, done;
 480 
 481     /* clear time cache */
             // 清空事件缓冲
 482     base->tv_cache.tv_sec = 0;
 483       //evsignal_base是全局变量,在处理signale时,用于指出signal所属的event_base实例
 484     if (base->sig.ev_signal_added)
 485         evsignal_base = base;
 486     done = 0;
 487     while (!done) { // 事件主循环 查看是否需要跳出循环 程序可以调用event_loopexit_cb()设置event_gotterm标记 调用event_base_loopbreak()设置event_base标记
 488         /* Terminate the loop if we have been asked to */
 489         if (base->event_gotterm) {
 490       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值