Libev中的超时监视器ev_timer,就是简单的相对时间定时器,它会在给定的时间点触发超时事件,还可以在固定的时间间隔之后再次触发超时事件。
所谓的相对时间,指的是如果你注册了一个1小时的超时事件,然后调整系统时间到了去年的一月份,该超时事件依然会在1个小时之后触发。
一:数据结构
1:超时监视器ev_timer结构:
typedef struct ev_timer
{
int active;
int pending;
int priority;
void *data;
void (*cb)(struct ev_loop *loop, struct ev_timer *w, int revents);
ev_tstamp at;
ev_tstamp repeat; /* rw */
} ev_timer;
其中的前五个成员是监视器的公共成员,其中的active在超时监视器中有特殊作用,那就是标明该监视器在堆数组timers中的下标。后两个成员at和repeat是ev_timer特有的。at表明定时器第一次触发的时间点,该是是根据mn_now设置的,repeat必须大于等于0,它表示每隔repeat秒,该定时器再次触发。如果repeat为0,表明该定时器只触发一次。
2:ev_watcher_time结构
typedef struct ev_watcher_time
{
int active;
int pending;
int priority;
void *data;
void (*cb)(struct ev_loop *loop, struct ev_watcher_time *w, int revents);
ev_tstamp at;
} ev_watcher_time;
typedef ev_watcher_time *WT;
ev_watcher_time的结构与ev_timer几乎一样,只是少了最后一个成员。该结构其实是ev_timer和ev_periodic的父类,它包含了ev_timer和ev_periodic的共有成员。
3:堆元素ANHE
#if EV_HEAP_CACHE_AT
typedef struct
{
ev_tstamp at;
WT w;
} ANHE;
#else
typedef WT ANHE;
#endif