[libevent]event_base_loop()
来源:互联网 发布:foobar2000音质优化版 编辑:程序博客网 时间:2024/06/11 07:04
intevent_base_loop(struct event_base *base, int flags){const struct eventop *evsel = base->evsel;//选择了epoll机制(如果之前选择了epoll)void *evbase = base->evbase;//epoll.c的epollop对象struct timeval tv;struct timeval *tv_p;int res, done;/* clear time cache */base->tv_cache.tv_sec = 0;//清除时间缓存,好让下面的gettime获得当前系统时间而不是获得缓存的时间if (base->sig.ev_signal_added)evsignal_base = base;//该变量也是一个全局的变量,赋值后关于信号的一些操作默认用到这个basedone = 0;while (!done) {/* Terminate the loop if we have been asked to */if (base->event_gotterm) {//这两个是用来中断循环的标识base->event_gotterm = 0;break;}if (base->event_break) {base->event_break = 0;break;}timeout_correct(base, &tv);//如果使用了monotonic时钟类型则这个函数就没用了tv_p = &tv;if (!base->event_count_active && !(flags & EVLOOP_NONBLOCK)) {//如果没有就绪的事件,则获得接下来需要最小等待时间,用作epoll_wait的时间参数timeout_next(base, &tv_p);} else {/* * if we have active events, we just poll new events * without waiting. */evutil_timerclear(&tv);//有就绪事件则无需等待epoll_wait,时间设置为0}/* If we have no events, we just exit *///无事件注册了则退出循环if (!event_haveevents(base)) {event_debug(("%s: no events registered.", __func__));return (1);}/* update last old time */gettime(base, &base->event_tv);//如果使用了monotonic时钟,则这个也没什么意义/* clear time cache */base->tv_cache.tv_sec = 0;res = evsel->dispatch(base, evbase, tv_p);//内部使用epoll_wait()等待事件,不过仅仅处理读写事件,信号事件在evsignal_process()函数处理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);}
0 0
- [libevent]event_base_loop()
- event_base_loop
- event_base_loop
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- libevent
- nodejs--fs模块
- Jquery 事件冒泡的介绍以及如何阻止事件冒泡
- Fat Models
- 文件下载不能使用ajax的替代解决方案
- HDU5443->ST表
- [libevent]event_base_loop()
- 基于比较的排序算法的最优下界---NlogN
- 虚拟机中的锁优化简介(适应性自旋/锁粗化/锁削除/轻量级锁/偏向锁)
- android studio 导出的jar中没有主清单属性
- 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果 确定比赛的名次
- Java中的IO技术使用总结
- C语言笔记
- Patrick and Shopping
- 【刷题之路】数组中出现次数超过一半的数字