libevent原始碼分析(1)
阿新 • • 發佈:2019-01-02
有過看nginx原始碼的基礎,現在來看libevent原始碼,感覺要輕鬆多了。。
第一篇文章,主要是還是介紹一些幾個重要的資料結構吧。。。。
首先是event結構:
至於每一個欄位是幹嘛用的基本上都標明出來了,libevent定義的事件型別如下:struct event { TAILQ_ENTRY (event) ev_next; //用於構成event的雙向連結串列 TAILQ_ENTRY (event) ev_active_next; TAILQ_ENTRY (event) ev_signal_next; unsigned int min_heap_idx; /* for managing timeouts */ //小根堆,主要是用於定時事件 struct event_base *ev_base; //所屬的eventbase結構 int ev_fd; //關聯的檔案描述符 short ev_events; //關心的事件型別 short ev_ncalls; //回撥函式執行的次數 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; //表明當前event的狀態 };
#define EV_TIMEOUT 0x01
#define EV_READ 0x02
#define EV_WRITE 0x04
#define EV_SIGNAL 0x08
#define EV_PERSIST 0x10 /* Persistant event */
定義的事件狀態如下:#define EVLIST_TIMEOUT 0x01 //事件在堆中 #define EVLIST_INSERTED 0x02 //時間已經註冊到連結串列當中 #define EVLIST_SIGNAL 0x04 // #define EVLIST_ACTIVE 0x08 //時間在啟用連結串列中 #define EVLIST_INTERNAL 0x10 #define EVLIST_INIT 0x80 //event已經初始化
好了,接下來來看另外一個結構的定義:
如果讀過nginx原始碼,那麼將會對它非常的熟悉,因為libevent底層也支援不同的事件型別,如epoll等,這裡全是函式指標,就指向他們的一些具體的實現函式。。。。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; };
接下來也是一個非常重要的定義:
struct event_base {
const struct eventop *evsel;
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 */
struct event_list **activequeues; //二級指標,因為支援優先順序
int nactivequeues;
/* signal handling info */
struct evsignal_info sig; //管理訊號
struct event_list eventqueue;
struct timeval event_tv;
struct min_heap timeheap; //用於維護定時事件的小根堆
struct timeval tv_cache;
};
這個是整個libevent的核心結構,因為所有的操作都離不開他,基本上每個申明的作用一看也能看出來,就不細細講了。
好了,重要的結構定義就先介紹到這裡。。。