libevent源代碼之c實現多態

讀libevent源代碼,有幾點體會,記錄以下,但願獵頭看到,趕忙來挖我啊。c++

一、libevent源代碼是用c語言寫的,可是經過結構體實現了c++中的多態,歎爲觀止。具體介紹以下:socket

struct eventop {
		const char *name;
		void *(*init)(struct event_base *);
		int (*add)(struct event_base *, evutil_socket_t fd, short old, short events, void *fdinfo);
		int (*del)(struct event_base *, evutil_socket_t fd, short old, short events, void *fdinfo);
		int (*dispatch)(struct event_base *, struct timeval *);
		void (*dealloc)(struct event_base *);
		int need_reinit;
		enum event_method_feature features;
		size_t fdinfo_len;
};

 

這個結構體,結構體裏定義了函數指針。包括初始化、添加刪除和dispatch等操做。Io的操做被封裝爲該結構體。具體的實現以epoll操做爲例函數

static const struct eventop epollops_changelist = {
	"epoll (with changelist)",
	epoll_init,
	event_changelist_add,
	event_changelist_del,
	epoll_dispatch,
	epoll_dealloc,
	1, /* need reinit */
	EV_FEATURE_ET|EV_FEATURE_O1,
	EVENT_CHANGELIST_FDINFO_SIZE
};

 

定義實現了這幾個函數。這個結構體至關於基類,便可以理解爲定義了這樣一個基類:spa

class eventop
{
    string name;
    virtual void *Init(struct event_base *) = 0;
    virtual int   add(struct event_base *, evutil_socket_t fd, short old, short events, void *fdinfo);
    virtual int   del(struct event_base *, evutil_socket_t fd, short old, short events, void *fdinfo);
    virtual int   dispatch(struct event_base *, struct timeval *);
    virtual void  dealloc(struct event_base *);
};

 而後epoll繼承該基類,實現具體的操做。經過該結構體,代碼把epoll和evsignal和equeue等抽象爲一個對象。簡化了代碼的邏輯指針

相關文章
相關標籤/搜索