【轉載】libevent核心數據結構

轉載自 libevent核心數據結構

event

event就是每一個需要處理的事件。

struct event {  
//TAILQ_ENTRY:雙向鏈表。用雙向鏈表保存IO和信號事件
 TAILQ_ENTRY (event) ev_next;  //IO事件雙向鏈表中位置
 TAILQ_ENTRY (event) ev_active_next;  //活躍的事件在活躍雙向鏈表中位置
 TAILQ_ENTRY (event) ev_signal_next;  //信號事件在雙向鏈表中的位置
 //時間事件用最小堆管理;下面表示該事件在最小堆的位置。最小堆位置:array的index
 unsigned int min_heap_idx; /* for managing timeouts */  
 struct event_base *ev_base;  //該事件屬於的base
 int ev_fd;  //IO套接字或者信號事件
 short ev_events;  //事件類型:IO或者定時或者信號num
 short ev_ncalls;  //事件發生後,調用回調函數的次數,通常只調用1次  
 short *ev_pncalls; /* Allows deletes in callback */  
 struct timeval ev_timeout;  //超時事件
 int ev_pri;  /* smaller numbers are higher priority */  
 void (*ev_callback)(int, short, void *arg);  //回調函數  
 void *ev_arg;  //傳入回調函數的參數
 int ev_res;  /* result passed to event callback */  
 int ev_flags; //事件當前狀態 ;擁有的狀態見下
};  
#define EVLIST_TIMEOUT 0x01 // event在time堆中  
#define EVLIST_INSERTED 0x02 // event在已註冊事件鏈表中  
#define EVLIST_SIGNAL 0x04 // 未見使用  
#define EVLIST_ACTIVE 0x08 // event在激活鏈表中  
#define EVLIST_INTERNAL 0x10 // 內部使用標記  
#define EVLIST_INIT     0x80 // event已被初始化 

libevent對event的管理

這裏寫圖片描述

每次當有事件event轉變爲就緒狀態時,libevent就會把它移入到active event list[priority]中,其中priority是event的優先級;

接着libevent會根據自己的調度策略選擇就緒事件,調用其cb_callback()函數執行事件處理;並根據就緒的句柄和事件類型填充cb_callback函數的參數。

event_base:管理所有的event

struct event_base {  
//evsel和evbase的關係可以理解爲evsel->add(evbase, event);
//struct eventop見下端代碼
 const struct eventop *evsel;  //指向select或epoll或poll等等中的一個
 void *evbase;   
 int event_count;  /* counts number of total events */  
 int event_count_active; /* counts number of active events */  
 int event_gotterm;  /* Set to terminate loop */  
 int event_break;  /* Set to terminate loop immediately */  
 /* active event management */  
 //活躍的事件;指針的指針 activequeues[priority]
 struct event_list **activequeues;  
 int nactivequeues;  //活躍事件的數量  
 /* signal handling info */  
 struct evsignal_info sig; //管理信號的結構體 
 struct event_list eventqueue;  //I0和信號事件的鏈表;在2.0版本中IO和信號拆分成兩個鏈表
 struct timeval event_tv;  //用於事件管理 
 struct min_heap timeheap;  //管理所有定事件的小根堆
 struct timeval tv_cache;  //用於事件管理
}; 
struct eventop {
 const char *name;
 void *(*init)(struct event_base *); // 初始化
 int (*add)(void *, struct event *); // 註冊事件
 int (*del)(void *, struct event *); // 刪除事件
 int (*dispatch)(struct event_base *, void *, struct timeval *); // 事件分發
 void (*dealloc)(struct event_base *, void *); // 註銷,釋放資源
 /* set if we need to reinitialize the event base */
 int need_reinit;
};
發佈了70 篇原創文章 · 獲贊 11 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章