系统架构分析
event.c和event.h 用于定义event结构体及其相关函数
kqueue.c和select.c 用于定义eventop(消息处理的模板类)的具体实现细节
sample/event-test.c 测试实例
mising/queue/sys/queue.c 定义QUEUE库
mising/time/sys/time.c 定义TIME库
event状态图

libevent核心策略模式
使用eventop作为策略模板,定义了add、dispatch等接口.
|
|
使用select等实现具体接口
|
|
将模式和实现结合起来
|
|
类型与变量
libevent最基础的数据类型是event
|
|
- ev_read_next可以用来找到在队列中下一个可以准备读的套接字
- ev_write_next可以用来找到在队列中下一个可以准备写的套接字
- ev_timeout_next可以用来找到在队列中下一个定时器
- ev_add_next可以用来找到在队列中下一个需要处理的事件
event的状态常量
|
|
timequeue、eventqueue和addqueue队列
ev_read_next、ev_write_next、ev_timeout_next和ev_add_next用于保存响应的事件链表
同时,在event.c中定义了timequeue、eventqueue和addqueue用于保存表头:
- timequeue: 定义event超时的链表
- eventqueue: 保存在循环中的event的链表
- addqueue:保存待处理的event的链表12345678struct event_list{struct event *tqh_first; /* first element */ /struct event **tqh_last; /* addr of last next element */ /}struct event_list timequeue;struct event_list eventqueue;struct event_list addqueue; //新创建的event,即将添加到响应链表eventqueue
TAILQ_ENTRY这个宏是定义在queue.h文件当中(可略)
|
|
控制类
selectop为event核心控制模块的模板
|
|
selectop在select方式下的实现, 保存对selectop(或evsel)的各种实现操作
|
|
定义控制类evbase和evsel
|
|
event.c当中存在一个全局数组struct eventop *eventops[]用于指示系统当中有以下哪些网络处理函数可使用:kqueue, epoll,poll, select等等。 然后程序会选择一个传给evsel, 并调用evsel的初始化函数返回一个指向网络处理函数结构体的指针给evbase,是具体eventop实现类的辅助工具。
|
|
主要函数
test.c范例文件入手:
|
|
event_init进行了全体初始化
|
|
除了初始化队列之外,选择第一个系统支持的函数处理程序,其顺序是kqueue, event_ports, epoll, poll,select.在找到了合适的程序支持,比如发现了select函数可以使用之后,把select的结构体selectop的地址传给evbase。
用event_set初始化一个事件
把socket以及事件、标志通通给结构体evfifo赋值
|
|
event_add给之前初始化的事件配置定时器
|
|
第一步是将event加入timequeue中,挂上EVLIST_TIMEOUT的标志,因为默认所有event都是可能超时的数据
第二步是判断libevent是否正在循环中,如果在而且标志了EVLIST_ADD,则返回;否则插进addqueue队尾,并标志EVLIST_ADD。可以看出EVLIST_ADD表明此event是否已经added进addqueue。我们可以把addqueue理解成待处理事件。
处理循环event_dispatch
|
|
其他相关函数
|
|
补充
event及其相关函数
|
|
libevent使用event及其函数+QUENUE库,构建一个消息管理的系统。用于消息的增删改查
eventop模板和其相关实现
|
|
eventop是消息处理的模板类,kqueque和select两个文件分别实现了两个具体的类,并用evbase来存放.libevent使用eventop模板结构体,来实现select等不同具体实现方式的兼容。其中event_*处理维护event队列的增删改查的同时,使用eventop的实现类select来完成具体的消息等待和处理过程。