目录
1.集成策略
1)系统的 I/O 机制像 select()和 epoll_wait()都允许程序制定一个最大等待时间(也称为最大超时时间)timeout,即使没有 I/O 事件发生,它们也保证能在 timeout 时间内返回。那么根据所有 Timer 事件的最小超时时间来设置系统 I/O 的 timeout 时间;当系统 I/O返回时,再激活所有就绪的 Timer 事件。
2)数据结构:小根堆
3)参考源码:timeout_next()函数根据堆中具有最小超时值的事件和当前时间来计算等待时间
static int timeout_next(struct event_base *base, struct timeval **tv_p)
{
struct timeval now;
struct event *ev;
struct timeval *tv = *tv_p;
// 堆的首元素具有最小的超时值
if ((ev = min_heap_top(&base->timeheap)) == NULL) {
// 如果没有定时事件,将等待时间设置为NULL,表示一直阻塞直到有I/O事件发生
*tv_p = NULL;
return (0);
}
// 取得当前时间
gettime(base, &now);
// 如果超时时间<=当前值,不能等待,需要立即返回
if (evutil_timercmp(&ev->ev_timeout, &now, <=))