讀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等抽象爲一個對象。簡化了代碼的邏輯指針