event和event_base是libevent的两个核心结构体,分别是反应堆模式中的Event和Reactor。源码分别位于event.h和event-internal.h中

1.event:

struct event {
TAILQ_ENTRY (event) ev_next; //I/O事件
TAILQ_ENTRY (event) ev_active_next; //所有激活事件的链表
TAILQ_ENTRY (event) ev_signal_next; //Signal事件
//定时事件在小根堆中的索引
unsigned int min_heap_idx; /* for managing timeouts */
struct event_base *ev_base; //event所属的Reactor
int ev_fd; //IO事件:绑定的文件描述符;Signal事件:绑定的信号
short ev_events; //I/O、信号、定时器
short ev_ncalls; //调用回调函数的次数
short *ev_pncalls; //指向ev_ncalls /* Allows deletes in callback */
struct timeval ev_timeout; //定时事件的超时值
int ev_pri; //event优先级 /* smaller numbers are higher priority */
void (*ev_callback)(int, short, void *arg); //回调函数:ev_fd, ev_events, ev_arg
void *ev_arg;
int ev_res; //调用回调函数时,传递给回调函数,保存回调函数的返回值 /* result passed to event callback */
int ev_flags; //event的当前状态
};
从event这个结构体我们可以看到libevent将I/O、信号、定时器3种事件统一封装成一个event来对待。
各成员都已详细注释,其中ev_events取值有:
// event.ev_events
#define EV_TIMEOUT 0x01
#define EV_READ 0x02
#define EV_WRITE 0x04
#define EV_SIGNAL 0x08
//永久事件
#define EV_PERSIST 0x10 /* Persistant event */

ev_flags取值有:

// event.ev_flags
// event在time堆中
#define EVLIST_TIMEOUT 0x01
//event在已注册事件链表中
#define EVLIST_INSERTED 0x02
#define EVLIST_SIGNAL 0x04
//event在激活链表中
#define EVLIST_ACTIVE 0x08
#define EVLIST_INTERNAL 0x10
//event已被初始化
#define EVLIST_INIT 0x80
/* EVLIST_X_ Private space: 0x1000-0xf000 */
#define EVLIST_ALL (0xf000 | 0x9f)

2.event_base:

struct event_base {
const struct eventop *evsel; //I/O多路复用机制的封装,eventops[]数组中一项
void *evbase; //I/O多路复用机制的一个实例,执行具体任务
int event_count; //该event_base上的总的event /* counts number of total events */
int event_count_active; //该event_base上的总的激活的event /* 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; //指针数组,activequeues[priority]指向优先级为priority的链表
int nactivequeues;
/* signal handling info */
struct evsignal_info sig; //管理Signal事件
struct event_list eventqueue; //链表,保存了所有注册事件event的指针
struct timeval event_tv; //时间管理
struct min_heap timeheap; //管理定时事件的小根堆
struct timeval tv_cache; //时间管理
};
其中eventop结构体和evbase是保存了I/O多路复用机制相关信息。evsel会调用init()去初始化evbase。
eventop结构体如下:
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源码分析—event, event_base的更多相关文章

  1. 【转】libevent源码分析

    libevent源码分析 转自:http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html 这两天没事,看了一下Memcached和l ...

  2. Libevent源码分析 (1) hello-world

    Libevent源码分析 (1) hello-world ⑨月份接触了久闻大名的libevent,当时想读读源码,可是由于事情比较多一直没有时间,现在手头的东西基本告一段落了,我准备读读libeven ...

  3. libevent源码分析一--io事件响应

    这篇文章将分析libevent如何组织io事件,如何捕捉事件的发生并进行相应的响应.这里不会详细分析event与event_base的细节,仅描述io事件如何存储与如何响应. 1.  select l ...

  4. Libevent源码分析—event_init()

    下面开始看初始化event_base结构的相关函数.相关源码位于event.c event_init() 首先调用event_init()初始化event_base结构体 struct event_b ...

  5. Libevent源码分析—event_add()

    接下来就是将已经初始化的event注册到libevent的事件链表上,通过event_add()来实现,源码位于event.c中. event_add() 这个函数主要完成了下面几件事: 1.将eve ...

  6. Libevent源码分析—event_set()

    初始化完event_base后,下面要初始化event,通过调用event_set()实现 .相关源码位于event.c event_set() void event_set(struct event ...

  7. Zepto源码分析-event模块

    源码注释 // Zepto.js // (c) 2010-2015 Thomas Fuchs // Zepto.js may be freely distributed under the MIT l ...

  8. Libevent源码分析系列【转】

    转自:https://www.cnblogs.com/zxiner/p/6919021.html 1.使用libevent库     源码那么多,该怎么分析从哪分析呢?一个好的方法就是先用起来,会用了 ...

  9. Libevent源码分析系列

    1.使用libevent库     源码那么多,该怎么分析从哪分析呢?一个好的方法就是先用起来,会用了,然后去看底层相应的源码,这样比较有条理,自上向下掌握.下面用libevent库写个程序,每隔1秒 ...

随机推荐

  1. c#遍历文件夹获得所有文件

    在c#中,想要获得一个文件夹下的所有子目录以及文件十分简单. 首先,获取目录的情况下,DirectoryInfo.GetDirectories():获取目录(不包含子目录)的子目录,返回类型为Dire ...

  2. AM335X开发板学习系列——环境搭建(vbox虚拟机ubuntu14.04下minicom的安装和配置)

    这个系列是我学习AM335X的总结. 1. ubuntu虚拟机的USB设备,选择启用usbserial 2. ubuntu虚拟机的网络,采用桥接模式,以保证开发板和ubuntu虚拟机能互相ping通 ...

  3. 腾讯云上Selenium用法示例

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:崔庆才 前言 在上一节我们学习了PhantomJS 的基本用法,归根结底它是一个没有界面的浏览器,而且运 ...

  4. 如何了解您的微软认证情况和MIC ID

  5. tmux配置

    bind k selectp -U bind j selectp -D bind h selectp -L bind l selectp -R bind -r ^k resizep -U 5 bind ...

  6. 【Tomcat源码学习】-4.连接管理

    前面几节主要针对于Tomcat容器以及内容加载进行了讲解,本节主要针对于连接器-Connector进行细化,作为连接器主要的目的是监听外围网络访问请求,而连接器在启动相关监听进程后,是通过NIO方式进 ...

  7. 简单介绍关于IOS的生命周期过程

    初步了解一下生命周期的过程: 1.通过alloc init 分配内存,初始化controller. 2.loadViewloadView方法默认实现[super loadView]如果在初始化cont ...

  8. Linux - PCB之task_struct结构体

     task_struct结构描述  1. 进程状态(State) 进程执行时,它会根据具体情况改变状态 .进程状态是调度和对换的依据.Linux中的进程主要有如下状态,如表4.1所示. 内核表示 含义 ...

  9. Unity C# const与static readonly的区别与联系

    using System; namespace Test { class MainClass { //懒人写法的单例 class Weapon { public static readonly Wea ...

  10. ASP.NET MVC4 微信公众号开发之网页授权(一):搭建基础环境

    首先你得注册并认证一个个人或企业的微信公众号===服务号从而确保获得以下接口权限: 然后打开公众号设置里的功能设置里找到业务域名和网页授权域名分别填上你的域名(注:已备案的域名),如下图所示: 到这里 ...