zoukankan      html  css  js  c++  java
  • Libevent源码分析系列

    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()处理活跃事件链表中的事件,调用相应的回调函数。
     
     
     
     
  • 相关阅读:
    Linux环境下MySQL报Table 'xxx' doesn't exist错误解决方法
    mysql主主复制(双主复制)配置步骤
    MHA安装手记
    MySQL MHA配置
    innobackupex 还原和备份实例
    scp命令
    给想进入餐饮业新手一些建议
    mysql mha 主从自动切换 高可用
    mysql innobackupex xtrabackup 大数据量 备份 还原
    MySQL主从复制、半同步复制和主主复制概述
  • 原文地址:https://www.cnblogs.com/zxiner/p/6919021.html
Copyright © 2011-2022 走看看