转自:https://www.cnblogs.com/zxiner/p/6919021.html

1.使用libevent库

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

2.event, event_base

    经过第1步,下面开始看上面程序中的每一部分的源码。首先是两个核心结构体event和event_base

3.event_init()

    下面开始进入libevent的运行流程了,首先调用是event_init()初始化event_base
    从event_init()源码中,看到event_init()调用了event_base_new()函数,这个函数才是完成event_base初始化的主要函数。event_base_new()首先在堆上分配内存来存储event_base结构,然后就是去初始化各种成员。
    值得注意的是,libevent用一个全局数组eventops存储系统支持的各种I/O多路复用机制,然后在event_base_new()中去遍历该数组,从中选择第1个I/O多路复用机制。
    因为event是可以设置优先级的,活跃事件链表中,优先级值越小,越优先。所以在event_base_new()函数内又调用了event_base_priority_init()函数初始化event_base的activequeues和nactivequeues成员。

4.event_set()、event_base_set()

    初始化完event_base后,下面要初始化event,通过调用event_set()实现;然后调用event_base_set()设置event所属的event_base 

  从源码可以看到,这步主要通过输入参数初始化event结构体,设置其回调函数,设置其在小根堆中索引,设置event的优先级。

5.event_add()

    接下来就是将event注册到event_base的事件链表中了。
    从源码分析出,这个函数主要完成了下面几件事:

    1.将event注册到event_base的I/O多路复用要监听的事件链表中
    2.将event注册到event_base的已注册事件链表中
    3.如果传入了超时时间,则删除旧的超时时间,重新设置,并将event添加到event_base的小根堆中;
       如果没有传入超时时间,则不会添加到小根堆中。
 该函数内添加到I/O多路复用监听事件链表、已注册事件链表、小根堆中都是通过event_queue_insert()完成的,相应的删除工作都是通过event_queue_remove()完成的。

6. event_base_dispatch()

  该函数只是做了调用event_base_loop()这一个动作,所以工作实际是在函数event_base_loop()内完成的。在该函数内部调用了eventop.dispatch()监听事件。并调用event_process_active()处理活跃事件链表中的事件,调用相应的回调函数。

Libevent源码分析系列【转】的更多相关文章

  1. Libevent源码分析系列

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

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

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

  3. jQuery源码分析系列

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...

  4. jQuery-1.9.1源码分析系列完毕目录整理

    jQuery 1.9.1源码分析已经完毕.目录如下 jQuery-1.9.1源码分析系列(一)整体架构 jQuery-1.9.1源码分析系列(一)整体架构续 jQuery-1.9.1源码分析系列(二) ...

  5. MyCat源码分析系列之——结果合并

    更多MyCat源码分析,请戳MyCat源码分析系列 结果合并 在SQL下发流程和前后端验证流程中介绍过,通过用户验证的后端连接绑定的NIOHandler是MySQLConnectionHandler实 ...

  6. MyCat源码分析系列之——SQL下发

    更多MyCat源码分析,请戳MyCat源码分析系列 SQL下发 SQL下发指的是MyCat将解析并改造完成的SQL语句依次发送至相应的MySQL节点(datanode)的过程,该执行过程由NonBlo ...

  7. MyCat源码分析系列之——BufferPool与缓存机制

    更多MyCat源码分析,请戳MyCat源码分析系列 BufferPool MyCat的缓冲区采用的是java.nio.ByteBuffer,由BufferPool类统一管理,相关的设置在SystemC ...

  8. MyCat源码分析系列之——前后端验证

    更多MyCat源码分析,请戳MyCat源码分析系列 MyCat前端验证 MyCat的前端验证指的是应用连接MyCat时进行的用户验证过程,如使用MySQL客户端时,$ mysql -uroot -pr ...

  9. MyCat源码分析系列之——配置信息和启动流程

    更多MyCat源码分析,请戳MyCat源码分析系列 MyCat配置信息 除了一些默认的配置参数,大多数的MyCat配置信息是通过读取若干.xml/.properties文件获取的,主要包括: 1)se ...

随机推荐

  1. Tensorflow搞一个聊天机器人

    catalogue . 前言 . 训练语料库 . 数据预处理 . 词汇转向量 . 训练 . 聊天机器人 - 验证效果 0. 前言 不是搞机器学习算法专业的,3个月前开始补了一些神经网络,卷积,神经网络 ...

  2. eclipse将javaSE项目导出成可执行jar包

    将第三方包和项目打包到一块 step1:选中要导出的项目,右键选择Export step2:选择java/Runable JAR file step3:选择main主程序,选择第三方包打包的形式,推荐 ...

  3. 【1】【leetcode-79】 单词搜索

    (典型dfs,知道思想写错) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单 ...

  4. 【1】【leetcode-115】 不同的子序列 distinct-subsequences

    不同的子序列 distinct-subsequences(hard) (忘了,典型) 给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数. 一个字符串的一个子序列是指,通过删 ...

  5. HDU - 1255 覆盖的面积 (线段树求面积交)

    https://cn.vjudge.net/problem/HDU-1255 题意 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 分析 求面积并的题:https://www.cnbl ...

  6. HDU 1030(三角数阵 数学)

    题意是问在给定的三角形数阵中从一个数到另一个数所要跨过的边数. 最初的时候很迷,除了发现每层的数字个数与层数间的关系和每层数最后一个数与层数的关系外什么也没看出来,打算先求出数字所在的层数,然后计算到 ...

  7. 多线程Thread类的方法

    创建多个线程的第一种方法 1.定义一个Thread类的子类,比如MyThread类 2.重写Thread的run方法,设置线程任务 3.创建Mythread类的对象 4.调用方法start(),开启新 ...

  8. sqlserver2012 offset分页

    select ID,UserName from user order by ID OFFSET (10 * (50-1)) ROW FETCH NEXT 10 rows only

  9. ASP.NET Web API 2 之文件下载

    Ø  前言 目前 ASP.NET Web API 的应用非常广泛,主要承载着服务端与客户端的数据传输与处理,如果需要使用 Web API 实现文件下载,该 实现呢,其实也是比较简单,以下示例用于下载安 ...

  10. url 组成部分

    NSURL其实就是我们在浏览器上看到的网站地址,这不就是一个字符串么,为什么还要在写一个NSURL呢,主要是因为网站地址的字符串都比较复杂,包括很多请求参数,这样在请求过程中需要解析出来每个部门,所以 ...