转自: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. Java Web之表单重复提交问题

    上篇文章讲了验证码的制作,提及到了一个问题,就是表单重复提交的问题,可能在上次那个验证码中感觉不是那么的重要 现在我新写一个例子,转钱.通过这个例子你就知道表单重复提交有多恐怖了. 先来简单的介绍一下 ...

  2. Java中的XML

    XML是一种可扩展的标记语言,可扩展就是<>内的东西可以自己定义,可以随便写.标记语言就是加了<>符号的 .HTML是超文本标记语言,不可以拓展,因为你写个<p> ...

  3. JAVA核心技术I---JAVA基础知识(回顾)

    一:对象实例化问题: public class Rectangle { ; ; public int area() { return width * height; } } 则如下代码输出结果为: R ...

  4. 19.职责链模式(Chain of Responsibility Pattern)

    19.职责链模式(Chain of Responsibility Pattern)

  5. Linux记录-shell获取hdfs used使用

    #!/bin/bash export JAVA_HOME=/app/jdk/jdk1.8.0_92 export HADOOP_HOME=/app/hadoop export HADOOP_CONF_ ...

  6. 13个.Net开源的网络爬虫

    请点击此处输入图片描述 1:.Net开源的跨平台爬虫框架 DotnetSpider Star:430 DotnetSpider这是国人开源的一个跨平台.高性能.轻量级的爬虫软件,采用 C# 开发.目前 ...

  7. hdu 2815 Mod Tree (exBSGS)

    http://acm.hdu.edu.cn/showproblem.php?pid=2815 //解 K^D ≡ N mod P #include<map> #include<cma ...

  8. Date类、SimpleDateFormat类

    Date 构造方法: 1.无参数构造方法: Date date = new Date(); System.out.println(date);// Thu Mar 28 16:28:40 CST 20 ...

  9. 二叉树的python可视化和常用操作代码

    二叉树是一个重要的数据结构, 本文基于"二叉查找树"的python可视化 pybst 包, 做了一些改造, 可以支持更一般的"二叉树"可视化. 关于二叉树和二叉 ...

  10. electron入门

    Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库. Electron通过将Chromium和Node.js合并到同一个运行时环境中,并 ...