event_dispatch这个函数是以上所有处理都结束以后,最后的一个借口调用,其实和这个函数类似的函数有好几个,接下来一一分析。
int
405 event_dispatch(void)
406 {
407 return (event_loop(0));
408 }
可以返现event_dispatch只有一个调用event_loop(),
但是event_loop函数的调用呢
int
467 event_loop(int flags)
468 {
469 return event_base_loop(current_base, flags);
470 }
471
event_loop的调用也是嵌套了一个函数,event_base_loop,那么我们看看这个event_base_loop函数总共被几个函数所调用
int
411 event_base_dispatch(struct event_base *event_base)
412 {
413 return (event_base_loop(event_base, 0));
414 }
其实最终的调用都是event_base_loop函数,但是不同之处就是传递的第一个参数,这个参数决定了event术语那个event_base,如果使用默认的情况就是current_base,如果是
用户自己的event_base就使用eventbase_diapatch函数。下面分析event_base_loop函数:
int
473 event_base_loop(struct event_base *base, int flags)
474 {
475 const struct eventop *evsel = base->evsel;
476 void *evbase = base->evbase;
477 struct timeval tv;
478 struct timeval *tv_p;
479 int res, done;
480
481 /* clear time cache */
// 清空事件缓冲
482 base->tv_cache.tv_sec = 0;
483 //evsignal_base是全局变量,在处理signale时,用于指出signal所属的event_base实例
484 if (base->sig.ev_signal_added)
485 evsignal_base = base;
486 done = 0;
487 while (!done) { // 事件主循环 查看是否需要跳出循环 程序可以调用event_loopexit_cb()设置event_gotterm标记 调用event_base_loopbreak()设置event_base标记
488 /* Terminate the loop if we have been asked to */
489 if (base->event_gotterm) {
490