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) {//如果小根堆里面没有事件则退出
/* if no time-based events are active wait for I/O */
*tv_p = NULL;
return (0);
}
if (gettime(base, &now) == -1)//获取当前时间
return (-1);
if (evutil_timercmp(&ev->ev_timeout, &now, <=)) {//如果当前时间大于定时的时间,说明已过时,tv清零返回
evutil_timerclear(tv);
return (0);
}
evutil_timersub(&ev->ev_timeout, &now, tv);//定时时间减去当前时间获得tv要等待的时间
assert(tv->tv_sec >= 0);
assert(tv->tv_usec >= 0);
event_debug(("timeout_next: in %ld seconds", tv->tv_sec));
return (0);
}
[libevent]timeout_next()
最新推荐文章于 2023-03-07 19:37:12 发布