前段時(shí)間對Libevent的源碼進(jìn)行了閱讀,現(xiàn)整理如下:
介紹
libevent是一個(gè)輕量級(jí)的開源高性能事件驅(qū)動(dòng)網(wǎng)絡(luò)庫,是一個(gè)典型的Reactor模型。其主要特點(diǎn)有事件驅(qū)動(dòng),高性能,跨平臺(tái),統(tǒng)一事件源等等。
網(wǎng)上關(guān)于libevent的源碼分析有很多相關(guān)博客,本人在學(xué)習(xí)過程中也是借助了網(wǎng)絡(luò)。所以,在此,關(guān)于libevent中的許多具體實(shí)現(xiàn)部分就不做介紹,主要是從相關(guān)數(shù)據(jù)結(jié)構(gòu)層面上去分析。僅供參考。
event結(jié)構(gòu)體
libevent中的事件處理類型是event結(jié)構(gòu)類型,event結(jié)構(gòu)體封裝了句柄,事件類型,回調(diào)函數(shù),以及其他必要的標(biāo)志和數(shù)據(jù),是整個(gè)libevent庫的核心。
該結(jié)構(gòu)的定義如下:
struct event{ /* * ev_next, ev_active_next都是雙向鏈表節(jié)點(diǎn)指針 * 它們是libevent對不同事件類型和在不同時(shí)期,對事件的管理時(shí)使用到的字段 * * libevent使用雙向鏈表保存所有注冊的IO和signal事件 * ev_next 就是該IO事件在鏈表中的位置,稱此鏈表為已注冊事件鏈表 * ev_active_next: libevent將所有激活事件放入鏈表active list中,然后遍歷active list * 執(zhí)行調(diào)度,ev_active_next就指明了event在active list中的位置 */ TAILQ_ENTRY(event) ev_next; TAILQ_ENTRY(event) ev_active_next; /* * _ev 是一個(gè)聯(lián)合體,所有具有相同描述符的IO事件通過ev.ev_io.ev_io_next成員串聯(lián)成一個(gè) * 尾隊(duì)列,稱之為IO事件隊(duì)列,所有具有相同信號(hào)值的信號(hào)事件通過ev.ev_signal.ev_signal_next * 串聯(lián)成一個(gè)尾隊(duì)列,稱之為信號(hào)事件隊(duì)列。ev.ev_signal.ev_ncalls成員指定時(shí)間發(fā)生時(shí),Reactor * 需要執(zhí)行多少次該事件對應(yīng)的回調(diào)函數(shù),ev.ev_signal.ev_pcalls要么是NULL,要么執(zhí)行ev.ev_signal.ev_ncalls */ union{ struct { TAILQ_ENTRY(event) ev_io_next; struct timeval ev_timeout; }ev_io; struct { TAILQ_ENTRY(even