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. Java 中的 String 类常用方法

    字符串广泛应用在Java编程中,在Java中字符串属于对象,String 类提供了许多用来处理字符串的方法,例如,获取字符串长度.对字符串进行截取.将字符串转换为大写或小写.字符串分割等. Strin ...

  2. 原生JavaScript实现焦点图轮播

    不管是高校的网站还是电商的页面,焦点图的切换和轮播应该是一项不可或缺的应用.今天把焦点图轮播制作的技术要点做下笔记,以供日后查看. 一.结构层(HTML) 焦点图的HTML结构很简单,就是一个父容器( ...

  3. JavaEE开发使用Maven管理的SpringMVC工程

    前几篇博客已经陆陆续续的聊了一些Spring的东西,今天博客我们就来聊一下SpringMVC.SpringMVC目前在JavaEE开发中可谓占据一席之地,用起来也是比较顺手的.低耦合,高内聚,利用一些 ...

  4. Python 列表(List) 的三种遍历(序号和值)方法

    三种遍历列表里面序号和值的方法: 最近学习python这门语言,感觉到其对自己的工作效率有很大的提升,特在情人节这一天写下了这篇博客,下面废话不多说,直接贴代码 #!/usr/bin/env pyth ...

  5. mac下安装Java开发环境

    1.安装JDK 打开网页,进入jdk官网下:http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载后,进入finde ...

  6. mvc 筛选器

    之前公司中,运用ActionFilterAttribute特性实现用户登录信息的验证,没事看了看,留下点东西备忘. 好的,瞅这玩意一眼就大概能猜到这货是干嘛的了吧,没错,action过滤器.其实就是A ...

  7. vim 字符串替换整理

    公司项目测试,要在vi编辑其中进行多路径修改,这时候用到了字符串替换的知识,在这里我自己整理了一下. 一.基本内容替换,无特殊符号 :s/old/new/  替换当前行第一个 old 为 new   ...

  8. Linq 查询与普通查询的区别

    普通:select * --1 from User(表名) as u --2 where u.Name like '%s%' --3 Linq : from User(表名) as u --1 whe ...

  9. jquery easyui的datagrid在初始化的时候会请求两次URL?

    我们项目前端用的是jquery easyui,刚开始使用datagrid加载列表初始化时总是请求两次URL,这让人非常不解,怎么总是请求两次呢?数据一多,加载速度明显变慢,通过查资料才知道原来是重复声 ...

  10. (知识点)JavaScript闭包

    下面是我对闭包的理解:(把他们整理出来,整理的过程也是在梳理) 1.首先,在理解闭包之前: 我们首先应该清楚下作用域和作用域链 作用域:每个函数定义时创建时自己的环境即作用域 作用域链:函数内可访问自 ...