转自: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. IDEA tomcat 部署WEB项目

    1. 2. 3.

  2. linux proc

    /proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用.可以使用的文件随系统配置的变化而变化. /proc/cmdline 这个文件给出了内核启动的命 ...

  3. protobuf 编译安装

    1.protobuf是google公司提出的数据存储格式,详细介绍可以参考:https://developers.google.com/protocol-buffers 2.下载最新的protobuf ...

  4. Windows-kms

    系统下载 Windows 长期服务版 Windows 10 Enterprise LTSC 2019 (x64) - DVD (Chinese-Simplified) 文件名 cn_windows_1 ...

  5. vue基础篇---watch监听

    watch可以让我们监控一个值的变化.从而做出相应的反应. 示例: <div id="app"> <input type="text" v-m ...

  6. Hudson管理平台自动化部署war包

    继上一篇:Hudson持续集成管理平台搭建 后,我们需要进行项目的自动化部署. 首先:我们先配置<系统管理>中的[系统设置] 然后返回到首页,点击项目名称进入项目内,点击设置: 翻到最底下 ...

  7. C#图像检测开源项目

    AForge.NET AForge.NET is an open source C# framework designed for developers and researchers in the ...

  8. css 动画【转】

    css 动画 http://www.w3school.com.cn/css3/css3_animation.asp

  9. Git与GitHub学习笔记(七)Windows 配置Github ssh key

    前言 SSH是建立在应用层和传输层基础上的安全协议,其目的是专为远程登录会话和其他网络服务提供安全性的保障,用过SSH远程登录的人都比较熟悉,可以认为SSH是一种安全的Shell.SSH登录是需要用户 ...

  10. 解决浏览器跨域限制方案之JSONP

    一.什么是JSONP JSONP即:JSON with Padding,是一种解决因浏览器跨域限制不允许访问跨域资源的方法. JSONP是一个非官方的协议,它允许在服务器端返回javascript标签 ...