libevent源码学习_结构体
来源:互联网 发布:网络词爸爸是什么意思 编辑:程序博客网 时间:2024/03/29 15:54
核心的结构体分析
一: Libevent是基于事件驱动(event-driven)的,从名字也可以看到event是整个库的核心。event就是Reactor框架中的事件处理程序组件;它提供了函数接口,供Reactor在事件发生时调用,以执行相应的事件处理,通常它会绑定一个有效的句柄。
其中的ev_fd 和 ev_callback函数指针是应用层需要实现的。 比如io事件中,ev_fd就是socket句柄,回调函数ev_callback的实现应该就是一个读或者写socket的函数。
用select或者epool作为管理事件的模型, 当该event的事件发生时,调用的就是这个回调函数。
struct event {
TAILQ_ENTRY (event) ev_next; /*io事件在链表中的位置(已注册事件链表)*/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; /*该事件所属的反应堆*/
int ev_fd; /*文件描述符或者是信号*/
short ev_events; /*事件类型*/
short ev_ncalls; /*事件就绪时,调用回调函数的次数,一般都是1啦*/
short *ev_pncalls; /*指针,通常指向ev_ncalls或者为NULL; 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; /*event初始化的时候指定的*/
int ev_res; /* 记录当前激活事件的类型 result passed to event callback */
int ev_flags; /*记录event信息的字段,表明当前的状态*/
};
二、event_base
event_base是libevent的处理框架,一个event_base事实上就是一个libevent的实例。
struct event_base {
const struct eventop *evsel; /*指明该event_base使用的是那个事件处理接口eventop*/
void *evbase; /*通过在evsel的Init方法初始化时返回的指针,后面很多操作都需要用到它*/
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; /*二级指针根据优先级把激活的event存放到对应的链表*/
int nactivequeues;
/* signal handling info */
struct evsignal_info sig; /*专门用于管理信号*/
struct event_list eventqueue; /*链表,保存了所有的注册事件event的指针。*/
struct timeval event_tv;
struct min_heap timeheap; /*管理定时事件的小根堆*/
struct timeval tv_cache;
};
三、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;
};
- libevent源码学习_结构体
- libevent源码学习_接口函数
- libevent学习之一:libevent源码的特点和结构
- libevent源码浅析: 主要的结构体
- libevent源码浅析: 主要的结构体
- libevent源码结构简介
- libevent源码分析--代码结构
- Libevent源码学习---bufferevent
- libevent源码分析---回顾主要的结构体
- Libevent源码分析之event结构体初识
- libevent源码学习研究(libevent-0.1)
- ibatis源码学习4_源码包结构
- libevent源码学习-第一天
- libevent源码学习-第二天
- libevent源码学习-第三天
- libevent源码学习-第四天
- libevent源码学习-----Reactor模型
- libevent源码学习-----阅读心得
- 【Android 安卓】腾讯推出安卓4.0 ROM:Tita
- 使用trac进行项目管理
- 设置文件的访问权限
- Fedora16为grub2添加、修改背景图片和字体颜色
- java面试题
- libevent源码学习_结构体
- Python2.6+PyQt4.8+eric4+汉化+开发教程
- 抽象工厂的一个例子
- hdoj 3006 The Number of set(位运算+枚举)
- ITbrand数据库品牌排行榜
- C++类成员的初始化
- INSERT LOG ERRORS
- 【推荐】SQL Server 2008 R2 中英文 开发版/企业版/标准版 下载
- 一顿饭吃一两斤肉和一顿饭吃几百斤肉