1. 程式人生 > >libevent原始碼分析(1)

libevent原始碼分析(1)

有過看nginx原始碼的基礎,現在來看libevent原始碼,感覺要輕鬆多了。。

第一篇文章,主要是還是介紹一些幾個重要的資料結構吧。。。。

首先是event結構:

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的狀態
};
至於每一個欄位是幹嘛用的基本上都標明出來了,libevent定義的事件型別如下:
#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已經初始化

好了,接下來來看另外一個結構的定義:

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;
};
如果讀過nginx原始碼,那麼將會對它非常的熟悉,因為libevent底層也支援不同的事件型別,如epoll等,這裡全是函式指標,就指向他們的一些具體的實現函式。。。。

接下來也是一個非常重要的定義:

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的核心結構,因為所有的操作都離不開他,基本上每個申明的作用一看也能看出來,就不細細講了。

好了,重要的結構定義就先介紹到這裡。。。