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

相关文章
相关标签/搜索