前言
在本小节中,我们将展开对定时事件的研究。首先还是和研究信号事件部分一样,先看看它是如何集成到多路I/O中的(或者说是如何与event_base联系起来的)。
如何将定时事件集成到主循环中
由于seletc、poll、epoll这类多路I/O机制支持定时,所以将定时事件集成到主循环中比起信号事件容易的多。我们只需要将定时事件注册到小根堆上,然后根据堆顶(最短超时事件)来计算多路I/O机制需要等待的最大超时时间,这样超时之后,就可以处理就绪的定时事件了。
在主循环中,有这样一段代码:
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);
}
...
res = evsel->dispatch(base, evbase, tv_p);
...
timeout_process(base);
timeout_next
用于计算主循环最大的等待时间,这里将tv_p
赋值为等待的时间。