前段時間對Libevent的源碼進行了閱讀,現(xiàn)整理如下:

介紹

libevent是一個輕量級的開源高性能事件驅(qū)動網(wǎng)絡(luò)庫,是一個典型的Reactor模型。其主要特點有事件驅(qū)動,高性能,跨平臺,統(tǒng)一事件源等等。
網(wǎng)上關(guān)于libevent的源碼分析有很多相關(guān)博客,本人在學(xué)習(xí)過程中也是借助了網(wǎng)絡(luò)。所以,在此,關(guān)于libevent中的許多具體實現(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ù),以及其他必要的標志和數(shù)據(jù),是整個libevent庫的核心。

  • 該結(jié)構(gòu)的定義如下:

    struct event{    /*     * ev_next, ev_active_next都是雙向鏈表節(jié)點指針     * 它們是libevent對不同事件類型和在不同時期,對事件的管理時使用到的字段     *     * 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 是一個聯(lián)合體,所有具有相同描述符的IO事件通過ev.ev_io.ev_io_next成員串聯(lián)成一個     * 尾隊列,稱之為IO事件隊列,所有具有相同信號值的信號事件通過ev.ev_signal.ev_signal_next     * 串聯(lián)成一個尾隊列,稱之為信號事件隊列。ev.ev_signal.ev_ncalls成員指定時間發(fā)生時,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
            
    		

    網(wǎng)友評論