libevent 初始化与event_init

为君一笑 提交于 2020-12-03 12:36:20

概述

在使用libevent函数之前,首先需要调用其event_init函数进行初始化。
初始化过程主要是创建一个全局默认的current_base变量,其类型为
struct event_base。

struct event_base对象变量可由eventn_base_new()函数创建并初始化。
libevent中,部分函数默认直接操作全局current_base,部分相同功能函数
可特别指定由event_base_new()创建的其他struct event_base变量,如:
    event_set()默认操作的全局current_base变量,
    event_base_set()则操作指定的event_base变量。

event_init与event_base_new函数

    该函数将调用event_base_new()函数,创建并初始化一个struct event_base对象,
    并将该对象赋值给全局变量current_base,作为全局默认的event_base。

    event_base_new()则用于创建一个新的event_base结构对象,并对其进行初始化。
    初始化过程包括选择使用的IO事件模型,创建事件队列等。

event_base结构

    struct event_base {
        const struct eventop *evsel;
        void                *evbase;
        int                  event_count;        /* counts number of total events */
        int                  event_count_active;/* counts number of active events */
        int                  event_gotterm;        /* Set to terminate loop */
        int                  event_break;        /* Set to terminate loop immediately */
        struct event_list  **activequeues;
        int                  nactivequeues;
        struct evsignal_info sig;
        struct event_list    eventqueue;
        struct timeval       event_tv; 
        struct min_heap      timeheap;
        struct timeval       tv_cache;
    };

    evsel:    当前使用的系统IO事件模型的抽象接口,event_base_new()函数会
                 按顺序检测可用的IO事件模型,该顺序为:
                  event ports, kqueue, epool, /dev/poll, poll, select.
    evbase:   evsel->init()的执行结果。在event_base_new()中,使用evsel->init()
                    的返回值判断特定的IO事件模型是否可用。(返回NULL则不可用)
    event_count:    当前event base中包含的事件数。
    event_count_active: 当前event base中活动的事件数。
    activequeues: 活动事件的队列。
    nactivequeues: activequeues的长度
    eventqueue:   当前event base中包含所有event的列表。
    event_tv:    在event_base_new中,设置为当前时间。
    timeheap:     libevent库使用一个最小堆结构,保存各个事件的超时时间,
                         从而可以优化超时判断的性能。








易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!