首页 > 其他 > 详细

libevent源代码之c实现多态

时间:2015-03-25 06:19:08      阅读:340      评论:0      收藏:0      [点我收藏+]

读libevent源代码,有几点体会,记录如下,希望猎头看到,赶紧来挖我啊。

1、libevent源代码是用c语言写的,但是通过结构体实现了c++中的多态,叹为观止。具体介绍如下:

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
};

 

定义实现了这几个函数。这个结构体相当于基类,即可以理解为定义了这样一个基类:

class eventop
{
    string name;
	void *Init(struct event_base *) = 0;
    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 *);
};

 然后epoll继承该基类,实现具体的操作。通过该结构体,代码把epoll和evsignal和equeue等抽象为一个对象。简化了代码的逻辑

 

libevent源代码之c实现多态

原文:http://www.cnblogs.com/xgcode/p/4364528.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!