第八章第四节 event结构体
event结构体封装了句柄、事件类型、回调函数以及其他必要的标志与数据。event结构体定义如下。
1 | /* |
以下是一些数据结构的详解。
evcb_active_next
所有被激活的事件处理器通过evcb_active_next成员串联成一个尾队列,即活动事件队列。
活动事件队列不止一个,不同优先级(evcb_pri成员)的事件处理器被激活后将被插入不同的活动事件队列中。
在事件循环中,Reactor将按优先级由高到低遍历所有活动事件队列,并依次处理其中的事件处理器。
evcb_flags
事件标志。有如下可选值。
- EVLIST_TIMEOUT。事件处理器从属于通用定时器队列/时间堆;
- EVLIST_INSERTED。事件处理器从属于注册事件队列;
- EVLIST_SIGNAL。此标志未使用;
- EVLIST_ACTIVE。事件处理器从属于活动事件队列;
- EVLIST_INTERNAL。用于内部使用;
- EVLIST_INIT。事件处理器已被初始化;
- EVLIST_ACTIVE_LATER。
- EVLIST_FINALIZING。
- EVLIST_ALL。定义所有标志;
evcb_closure
指定event_base执行事件处理器的回调函数时的行为。有如下可选值。
- EV_CLOSURE_EVENT。默认行为,调用evcb_callback回调函数;
- EV_CLOSURE_EVENT_SIGNAL。执行信号事件处理器的回调函数时,调用ev_signal.ev_ncalls次回调函数;
- EV_CLOSURE_EVENT_PERSIST。执行完回调函数后,再次将事件处理器加入注册事件队列;
- EV_CLOSURE_CB_SELF。调用evcb_selfcb回调函数;
- EV_CLOSURE_CB_FINALIZE。正在完成的回调,使用evcb_cbfinalize回调函数;
- EV_CLOSURE_EVENT_FINALIZE。正在完成的回调,使用evcb_evfinalize回调函数;
- EV_CLOSURE_EVENT_FINALIZE_FREE。正在完成的回调,且之后事件处理器将被释放;使用evcb_evfinalize回调函数;
ev_timeout_pos
定时器通常由时间堆来管理,但一些情况下使用简单的链表来管理效率更高。2.0版本的libevent引入了所谓”通用定时器”的概念,这些定时器存储在尾队列中,记为通用定时器队列。
其中ev_next_with_common_timeout成员指定通用定时器情况下该定时器在通用定时器队列中的位置;min_heap_idx成员指定其他定时器情况下该定时器在时间堆中的位置。
一个定时器是否为通用定时器取决于其超时值大小,通过event.c中的is_common_timeout函数判断。
ev_
所有具有相同文件描述符的I/O事件处理器通过ev_io.ev_io_next成员串联成一个尾队列,即I/O事件队列;所有具有相同信号值的信号事件处理器通过ev_signal.ev_signal_next成员串联成一个尾队列,即信号事件队列。
ev_signal.ev_ncalls成员指定信号事件发生后,Reactor需要执行多少次该事件对应的事件处理器中的回调函数。ev_signal.ev_pncalls成员要么指向ev_signal.ev_ncalls,要么为空。