关于libevent时间控制

时间:2022-09-16 00:14:09

函数的作用是: 比较当前事件时间和缓存累计时间 系统使用了tv_cache缓存累计时间,超过一秒更新到当前系统时间  static void
timeout_correct(struct event_base *base, struct timeval *tv)
{
 struct event **pev;
 unsigned int size;
 struct timeval off;
  if (use_monotonic) 如果用了timespec直接返回
  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;
 }
  event_debug(("%s: time is running backwards, corrected",
      __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);
 }
}
   函数的作用是:系统使用了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);
 }
 #if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
 if (use_monotonic) {
  struct timespec ts;
   if (clock_gettime(CLOCK_MONOTONIC, &ts) == -1)
   return (-1);
   tp->tv_sec = ts.tv_sec;
  tp->tv_usec = ts.tv_nsec / 1000;
  return (0);
 }
#endif
 如果没有到1秒,调用gettimeofday获取当前时间 return (evutil_gettimeofday(tp, NULL));
}