event_internal.h头文件主要声明了eventop与event_base结构,对这两个结构的深入理解,是对整个libevent处理流程理解的基础
-
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; //是否需要重新初始化
-
}
eventop结构里面包括了5个函数指针,可以把eventop结构理解为一种实现IO多路复用的接口
libevent支持epoll,select,kqueue、/dev/poll4中IO多路复用接口,并提供了对这四种技术的封装,每种封装都是按照eventop结构的规范进行实现。
-
struct event_base {
-
const struct eventop *evsel; // 该变量表示event_base使用的是哪种多路复用技术,该结构在初始化的时候,会绑定到static const struct eventop* eventops[]中的一个
-
void *evbase; //该变量表示具体的eventop实例
-
int event_count; /* counts number of total events */ //总共的event数量
-
int event_count_active; /* counts number of active events */ //当前active event数量
-
-
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; //event_list结构需要TAILQ_HEAD(name,type)来声明,如TAILQ_HADE(event_list,event),声明一个类型为eventlist,名为eventqueue的链表头节点
-
struct timeval event_tv; //
-
-
struct min_heap timeheap; //小根堆,用来管理超时的事件
-
-
struct timeval tv_cache; //
-
}
event_base是libevent的基础结构,
evsel,evbase两个变量决定了event_base采用的是哪种多路复用的技术。
event_count,event_count_active, eventqueue对event_base中的event进行存储与控制。
event_gotterm, event_break对主循环是否对出进行控制
activequeues, nactivequeues对eventbase中的活动链表进行管理
sig结构对signal event进行管理
timeheap对timeout event进行管理
event_tv, tv_cache用于主循环的时间控制上
阅读(861) | 评论(0) | 转发(0) |