源代码组织结构
libevent库主要分为:头文件、辅助功能函数、日志、libevent框架、对系统IO多路复用机制的封装、信号管理、定时事件管理、缓冲区管理、基本数据结构和基于libevent的两个实用库等几部分。
头文件
主要就是event.h:事件宏定义、接口函数声明,主要结构体event的声明
内部头文件
xxx-internal.h:内部数据结构和函数,对外不可见,以达到信息隐藏的目的
libevent框架
event.c:event整体框架的代码实现
对系统IO多路复用机制的封装(Linux默认使用epoll)
epoll.c:对epoll的封装
1). epoll_init(event_base_new, event_init)
2). epoll_changelist_add/epoll_nochangelist_add(event_add)
3). epoll_dispatch
4). epoll_changelist_del/epoll_nochangelist_del(在evmap_io_del中被调用)
5). epoll_dealloc(在event_base_free中被调用)
poll.c:对poll的封装
select.c:对select的封装
devpoll.c:对/dev/poll的封装
kqueue.c:对kqueue的封装
定时事件管理
min-heap.h:其实就是一个以时间作为key的小根堆结构
信号管理
signal.c:对信号事件的处理
辅助功能函数
evutil.h和evutil.c:一些辅助功能函数,包括创建socket pair和一些时间
操作函数:加、减和比较等
日志
log.h和log.c:log日志函数
缓冲区管理
evbuffer.c和buffer.c:libevent对缓冲区的封装
基本数据结构
compact/sys下的两个源文件:queue.h是libevent基本数据结构的实现,包括
链表,双向链表,队列等。
网络库
http和evdns:是基于libevent实现的http服务器和异步dns查询库
源码分析
Reactor — 反应器
典型的Reactor声明方式,反应器时事件管理的接口
1 | class Reactor { |
在libevent中就是event_base结构体, event_base是一组event的集合
1 | /* event-internal.h */ |
EventHandler — 事件处理程序
event是整个libevent库的核心,是Reactor框架中的事件处理程序组件,它提供了函数接口,供Reactor在事件发生时
调用,以执行相应的事件处理,通常它会绑定一个有效的句柄。
1 | /* include/event2/event_struct.h */ |
宏展开后为:
1 | struct event { |
Signal
1 | struct evsig_info { |
event_list
ev_map.c中的evmap_io中用到了event_list结构,event_list在event_struct.h
的结构是:
1 | TAILQ_HEAD (event_list, event); |
使用cpp或者gcc -E展开后得到的结果:
1 | struct event_list |