EventLoop

active

  何为活跃就是事件就绪,如果事件就绪 event循坏会把该事件标志为就绪。

可设置的event循坏 int event_base_loop(struct event_base *base, int flags)

#define EVLOOP_ONCE             0x01   // 代表就循坏1次
#define EVLOOP_NONBLOCK         0x02
#define EVLOOP_NO_EXIT_ON_EMPTY 0x04

  第一个选项,代表,这个函数会一直循坏等待事件就绪,然后把就绪的事件跑完后返回。
  第二个选项,不会阻塞,调用的时候如果事件活跃就调用回调函数,如果没有就返回。
  第三个选项,代表一直死循坏,除非该 event_base 调用 退出函数来退出。event_base_loopbreak / exit 。
  返回值 0 正常, -1 有error,1 代表非阻塞时候的事件未就绪的返回。

event_base_loop算法
while (any events are registered with the loop,
        或者 设置EVLOOP_NO_EXIT_ON_EMPTY  ) {

    if (EVLOOP_NONBLOCK was set, or any events are already active)
        If any registered events have triggered, mark them active.
    else
        Wait until at least one event has triggered, and mark it active.

    /****************************************************/
       下面这个for循坏只有上面的代码标记了活跃,下面才会调对应
       event的回调函数
    /***************************************************/
    for (p = 0; p < n_priorities; ++p) {
       if (any event with priority of p is active) {
          Run all active events with priority of p.
          break; /* Do not run any events of a less important priority */
       } 
    }
    /********最低优先级将不会跑它的回调函数***************/
    if (EVLOOP_ONCE was set or EVLOOP_NONBLOCK was set)
       break;
}

默认的event循坏event_base_dispatch

  它跟没有设置flag的event_base_loop一样,它会一直循坏当没有任何注册事件(即没有任何 pending状态的事件时才会 退出循坏 )或者调用了退出函数,它才退出。
  所谓没有任何注册事件,指要么所有event都是非持久化的 (没设置 EV_PERSIST) 然后其回调函数都被调用了,所有 event_base中并没有 pending态的event,要么就是 通过event_del 把 所有 event 事件从 event_base都删除了造成没有任何pending态的event。
  当该event_base没有 pending态的 event,此循环就会退出。

循坏退出函数

int event_base_loopexit(struct event_base *base,  const struct timeval *tv)  
int event_base_loopbreak(struct event_base *base);
返回值 成功0  失败 -1

第一个函数中 tv 是时间,定时用的,如果时间到了则执行event_base_loopexit ,传NULL立即执行event_base_loopexit 函数。
这俩个函数都会使循坏退出,但是区别是 event_base_exit 不会立即退出,它至少跑一轮循坏,就像设置了event_once选项一样。(如果正在跑活跃事件,就把当前所有活跃的跑一遍)

event_base_loopbreak 则不同,如果正在执行回调函数,执行完当前回调函数就退出,不会跑一轮,如果 event_base 没有活跃事件则立即停止循坏。 若event_base 没有循坏,就像没有调用过退出函数一样。

查看是调用那个函数退出
int event_base_got_exit(struct event_base *base)
int event_base_got_break(structevent_base *base)

event_base_loopbreak

  该函数用来当跑完当前回调函数后,通知event_base重新检测一遍活跃事件,然后跑活跃的event的回调函数

void event_base_dump_events(struct event_base *base, FILE *f)

  输出消息用来调试程序的。

阅读更多
个人分类: Libevent
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

EventLoop

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭