libevent源码浅析(一)[VC/C++编程]
本文“libevent源码浅析(一)[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
这里解析的是libevent-1.4.9.
PS:前面还看了libev的源代码,妈的,那代码写的太猥亵了,相对比libevent代码写的好多了..
首先来看一下最主要的几个数据构造:
eventop构造体是全部事件驱动模子的基类.全部的io复用范例城市实现此构造体里各种办法.
struct eventop {
const char *name; ///<事件驱动名称
void *(*init)(struct event_base *); //<初始化
int (*add)(void *, struct event *); ///<加入新的事件监测
int (*del)(void *, struct event *); ///<从事件监测中删除某一事件
int (*dispatch)(struct event_base *, void *, struct timeval *);///<启动此事件监测
void (*dealloc)(struct event_base *, void *); ///<释放此事件驱动的资源
/* set if we need to reinitialize the event base */
int need_reinit; ///<标志位
};
event_base管理全部的event对象,它包含了一些全部变量,比方事件驱动引擎evsel等.全部的event对象城市包含这个构造体.
struct event_base {
const struct eventop *evsel; ///<事件驱动引擎
void *evbase; ///<事件驱动引擎的全局数据,在每一个事件引擎文件中定义,下面会介绍.
int event_count; /* counts number of total events */
int event_count_active; /* counts number of active events */
int event_gotterm; /* Set to terminate loop */
int event_break; /* Set to terminate loop immediately */
/* active event management */
struct event_list **activequeues; ///<激活行列
int nactivequeues; ///<激活行列数目
/* signal handling info */
struct evsignal_info sig; ///<信号
struct event_list eventqueue; ///<全部事件行列
struct timeval event_tv;
struct min_heap timeheap; ///<这里libevent将按时器行列实现为一个最小堆,也就是为了每次都把时间最晚的按时器能取出来,然后实现超时.更其实算法很简单,想要具体的理解可以去看下算法导论的第六章的Priority queues.
struct timeval tv_cache;
};
event构造表示每个事件,包含了一些事件私有的数据,比方回调函数等..这里事件链表它利用了tail queue.
struct event {
TAILQ_ENTRY (event) ev_next; ///<下一个事件
TAILQ_ENTRY (event) ev_active_next; ///<下一个激活事件
TAILQ_ENTRY (event) ev_signal_next; ///<下一个信号事件列表
unsigned int min_heap_idx; /* for managing timeouts */
struct event_base *ev_base; ///<全局的base
int ev_fd; ///<所需求监测的事件句柄
short ev_events;
short ev_ncalls;
short *ev_pncalls; /* Allows deletes in callback */
struct timeval ev_timeout; ///<超不时间
int ev_pri; /* smaller numbers are higher priority */
void (*ev_callback)(int, short, void *arg); ///<回调函数
void *ev_arg; ///<传送给回调函数的参数
int ev_res; /* result passed to event callback */
int ev_flags;
};
以上是“libevent源码浅析(一)[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |