先上一段libevent提供的代码:
int lasttime;
static void
timeout_cb(int fd, short event, void *arg)
{
struct timeval tv;
struct event *timeout = arg;
int newtime = time(NULL);
printf("%s: called at %d: %d\n", __func__, newtime,
newtime - lasttime);
lasttime = newtime;
evutil_timerclear(&tv);
tv.tv_sec = 2;
event_add(timeout, &tv);
}
int
main (int argc, char **argv)
{
struct event evTimeout;
struct timeval tvElapse;
/* Initalize the event library */
event_init();
/* Initalize one event */
evtimer_set(&evTimeout, timeout_cb, &evTimeout);
evutil_timerclear(&tvElapse);
tvElapse.tv_sec = 2;
event_add(&evTimeout, &tvElapse);
lasttime = time(NULL);
event_dispatch();
return (0);
}
跟踪发现添加超时事件流程为:
evtimer_set --> event_add --> event_queue_insert --> min_heap_push
(构造超时结构体)
(将该结构体加入到主事件中)
最终我们发现是加入到最小堆中。
那么何时,如何调用该事件呢?
event_base_loop --> event_process_active --> (*ev->ev_callback)((int)ev->ev_fd, ev->ev_res, ev->ev_arg);
这样完成了。