前段时间对Libevent的源码进行了阅读,现整理如下:
介绍
libevent是一个轻量级的开源高性能事件驱动网络库,是一个典型的Reactor模型。其主要特点有事件驱动,高性能,跨平台,统一事件源等等。
网上关于libevent的源码分析有很多相关博客,本人在学习过程中也是借助了网络。所以,在此,关于libevent中的许多具体实现部分就不做介绍,主要是从相关数据结构层面上去分析。仅供参考。
event结构体
libevent中的事件处理类型是event结构类型,event结构体封装了句柄,事件类型,回调函数,以及其他必要的标志和数据,是整个libevent库的核心。
该结构的定义如下:
struct event{ /* * ev_next, ev_active_next都是双向链表节点指针 * 它们是libevent对不同事件类型和在不同时期,对事件的管理时使用到的字段 * * libevent使用双向链表保存所有注册的IO和signal事件 * ev_next 就是该IO事件在链表中的位置,称此链表为已注册事件链表 * ev_active_next: libevent将所有激活事件放入链表active list中,然后遍历active list * 执行调度,ev_active_next就指明了event在active list中的位置 */ TAILQ_ENTRY(event) ev_next; TAILQ_ENTRY(event) ev_active_next; /* * _ev 是一个联合体,所有具有相同描述符的IO事件通过ev.ev_io.ev_io_next成员串联成一个 * 尾队列,称之为IO事件队列,所有具有相同信号值的信号事件通过ev.ev_signal.ev_signal_next * 串联成一个尾队列,称之为信号事件队列。ev.ev_signal.ev_ncalls成员指定时间发生时,Reactor * 需要执行多少次该事件对应的回调函数,ev.ev_signal.ev_pcalls要么是NULL,要么执行ev.ev_signal.ev_ncalls */ union{ struct { TAILQ_ENTRY(event) ev_io_next; struct timeval ev_timeout; }ev_io; struct { TAILQ_ENTRY(even