函数的作用是: 比较当前事件时间和缓存累计时间
系统使用了tv_cache缓存累计时间,超过一秒更新到当前系统时间
static void
timeout_correct (struct event_base *base, struct timeval *tv)
{
struct event **pev;
unsigned int size;
struct timeval off;
timeout_correct (struct event_base *base, struct timeval *tv)
{
struct event **pev;
unsigned int size;
struct timeval off;
if (use_monotonic)
如果用了timespec直接返回
return;
return;
是不是时间落后了?
/* Check if time is running backwards */
gettime(base, tv); 如果缓冲累积的时间秒到达一秒以上,调用gettimeofday获取当前时间
if (evutil_timercmp(tv, &base->event_tv, >=)) { tv_cache缓存累计时间,是否大过事件的时间
base->event_tv = *tv; 大过了,则以tv_cache缓存时间为准
return;
}
gettime(base, tv); 如果缓冲累积的时间秒到达一秒以上,调用gettimeofday获取当前时间
if (evutil_timercmp(tv, &base->event_tv, >=)) { tv_cache缓存累计时间,是否大过事件的时间
base->event_tv = *tv; 大过了,则以tv_cache缓存时间为准
return;
}
event_debug(("%s: time is running backwards, corrected",
__func__)); 获取落后的时间差
evutil_timersub(&base->event_tv, tv, &off);
__func__)); 获取落后的时间差
evutil_timersub(&base->event_tv, tv, &off);
/*
* We can modify the key element of the node without destroying
* the key, beause we apply it to all in the right order.
*/ 如果事件时间没有超过缓存时间
pev = base->timeheap.p; 事件时间数组p指针
size = base->timeheap.n; 数组大小
for (; size-- > 0; ++pev) { 遍历数组所有超时时间,把时间减回来
struct timeval *ev_tv = &(**pev).ev_timeout;
evutil_timersub(ev_tv, &off, ev_tv);
}
}
* We can modify the key element of the node without destroying
* the key, beause we apply it to all in the right order.
*/ 如果事件时间没有超过缓存时间
pev = base->timeheap.p; 事件时间数组p指针
size = base->timeheap.n; 数组大小
for (; size-- > 0; ++pev) { 遍历数组所有超时时间,把时间减回来
struct timeval *ev_tv = &(**pev).ev_timeout;
evutil_timersub(ev_tv, &off, ev_tv);
}
}
函数的作用是:系统使用了tv_cache缓存累计时间,超过一秒更新到当前系统时间
static int
gettime (struct event_base *base, struct timeval *tp)
{
if (base->tv_cache.tv_sec) { 如果缓冲的时间秒大于0,即1秒
*tp = base->tv_cache; 拷贝回给参数tp
return (0);
}
gettime (struct event_base *base, struct timeval *tp)
{
if (base->tv_cache.tv_sec) { 如果缓冲的时间秒大于0,即1秒
*tp = base->tv_cache; 拷贝回给参数tp
return (0);
}
#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
if (use_monotonic) {
struct timespec ts;
if (use_monotonic) {
struct timespec ts;
if (clock_gettime(CLOCK_MONOTONIC, &ts) == -1)
return (-1);
return (-1);
tp->tv_sec = ts.tv_sec;
tp->tv_usec = ts.tv_nsec / 1000;
return (0);
}
#endif
tp->tv_usec = ts.tv_nsec / 1000;
return (0);
}
#endif
如果没有到1秒,调用gettimeofday获取当前时间
return (evutil_gettimeofday(tp, NULL));
}
}