读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等抽象为一个对象。简化了代码的逻辑指针