前言
在正式閱讀源碼之前,我們先對libevent的整體結構有大致的瞭解。這對我們在大體上了解libevent很有好處。
源文件結構
進入到libevent庫目錄裏面一看,好像還挺多的,不過除去腳本還有.lo
與.la
這些用libtool編譯出來的目標文件以及庫文件,也沒剩多少了。
主要分爲事件頭文件、內部頭文件、事件主框架、對多種多路I/O複用的機制的封裝、信號管理方面、定時事件管理方面、緩衝區管理方面、日誌管理、基礎數據結構、測試代碼、Windows下的源文件、使用libevent實現的http服務器、使用libevent實現的dns查詢庫。大致就這些。
- 事件頭文件:
event.h
:裏面定義了event
結構體以及evbuffer
結構體以及聲明瞭event.c
中需要使用的接口以及evbuffer.c
需要使用的接口還有部分時間以及信號管理需要的宏函數event-internal.h
):定義了struct eventop
結構體,以及struct event_base
結構體。還聲明瞭一些接口。
- 事件主框架(
event.c
):整個libevent的核心運行框架就在這裏面,裏面用到了其他各部分的接口及變量。 - 多種多路I/O機制的封裝:
select.c
:封裝了select機制poll.c
:封裝了poll機制epoll.c
:封裝了epoll機制kqueue.c
:封裝了kqueue機制(這個沒有了解過,貌似是在BSD系統上用的)
- 信號管理:
evsignal.h
:定義了struct evsignal_info
結構體,用於管理信號並聲明瞭信號管理部分需要的接口。evsignal.c
:定義了各種信號管理需要的接口,如信號管理的初始化、註冊信號事件、刪除信號事件以及將信號添加到就緒事件中。
- 定時事件管理:
min_heap.h
:libevent管理定時事件是以小根堆來管理的,以時間爲key,裏面定義了小根堆的結構以及一些操作。還有一些關於時間的在evutil.c
中。
- 緩衝區管理(
evbuffer.c
和buffer.c
):管理緩衝區部分 - 日誌管理(
log.h
和log.c
):日誌管理部分 - 輔助函數(
evutil.h
和evutil.c
):一些其他源文件會用到的輔助功能的函數 - 基礎數據結構:在
compat
目錄下,queue.h
裏面實現了一些常用的數據結構,如雙向鏈表、隊列等,_libevent_time.h
:一些關於時間操作的代碼 - 測試代碼:在
test
和sample
目錄下,可以用於檢測libevent庫是否裝好 - Windows下的源文件:
WIN32-Code
和WIN32-Prj
- 使用libevent實現的http服務器:主要是
http.c
和http-internal.h
- 使用libevent實現的dns查詢庫:主要是
evdns.c
和evdns.h
- 使用libevent實現的rpc服務器(Remote Procedure Call Protocol):主要是
evrpc.h
、evrpc.c
、evrpc-internal.h
- 注意帶
-internal.h
的頭文件,裏面定義的一般都是libevent內部使用的成員及函數
大致順序
接下來我們閱讀源碼的大致順序是:
- 事件主框架
- 事件部分
- 事件主框架及主循環
- 信號部分
- 定時事件部分
- 時間管理
- libevent如何把多種I/O複用技術集合在一起
- 緩衝區管理