博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
libevent 源码学习九 —— 集成定时器事件
阅读量:5363 次
发布时间:2019-06-15

本文共 1028 字,大约阅读时间需要 3 分钟。

前言 : 与 Signal 相比,Timer 事件的集成会直观和简单很多 1. 集成到事件主循环 因为系统的 I/O 机制都允许程序制定一个最大的等待时间 timeout。就可以根据 Timer 事件的最小超时时间来设置系统 I/O 的 timeout时间。 2 代码解析 if(!base -> event_count_active && !(flags & EVLOOP_NONBLOCK)) {// 根据 TImer 事件计算 evsel -> dispatch 的最大等待时间 timeout_next(base, &tv_p); } else {// 如果还有活动事件,就不要等待,让 evsel -> dispatch 立即返回 evutil_timerclear(&tv); } res = evsel -> dispatch(base, evbase, tv_p); // 处理超时事件,插入到激活链表中 timeout_process(base) timeout_next() 函数根据堆中具有最小超时值的事件和当前时间来计算等待时间。 static int timeout_next(struct event_base *base, struct timeval ** tv_p){ struct timeval now; struct event *event; struct timeval *tv = *tv_p; // 堆的首元素具有最小的超时值 if((ev = min_heap_top(&base -> timeheap)) == NULL ) {// 如果没有定时事件, 将等待时间设置为 NULL *tv_p = NULl; return 0; } // 取得当前时间 gettime(base, &now); // 如果超时时间 <= 当前值,不能等待,需要立即返回 if(evutil_timercmp(&ev -> ev_timeout, &now, <=)) { evutil_timerclear(tv); return 0; } // 计算等待的时间 = 当前的时间 - 最小的超时时间 evutil_timersub(&ev -> ev_timeout, &now, tv); return 0; }

转载于:https://www.cnblogs.com/sanerer/p/10806120.html

你可能感兴趣的文章
【FZSZ2017暑假提高组Day9】猜数游戏(number)
查看>>
练习10-1 使用递归函数计算1到n之和(10 分
查看>>
Oracle MySQL yaSSL 不明细节缓冲区溢出漏洞2
查看>>
Code Snippet
查看>>
zoj 1232 Adventure of Super Mario
查看>>
组合数学 UVa 11538 Chess Queen
查看>>
Redis常用命令
查看>>
[转载]电脑小绝技
查看>>
thinkphp如何实现伪静态
查看>>
BZOJ 1925: [Sdoi2010]地精部落( dp )
查看>>
c++中的string常用函数用法总结!
查看>>
Week03-面向对象入门
查看>>
一个控制台程序,模拟机器人对话
查看>>
Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(上篇——纯前端多页面)
查看>>
我的PHP学习之路
查看>>
【题解】luogu p2340 奶牛会展
查看>>
解决响应式布局下兼容性的问题
查看>>
使用DBCP连接池对连接进行管理
查看>>
【洛谷】【堆+模拟】P2278 操作系统
查看>>
hdu3307 欧拉函数
查看>>