关于libevent时间控制

函数的作用是: 比较当前事件时间和缓存累计时间
 
系统使用了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));
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值