libevent(三)event_base

libevent能够处理三种事件: I/O、信号、定时器。

涉及两个数据结构:

  event,表示一个事件

  event_base,管理所有事件

本文主要介绍event_base,结构如下:

struct event_base {
    const struct eventop *evsel;        // backend
    void *evbase;

    const struct eventop *evsigsel;
    struct evsig_info sig;

    int event_count;                    // 事件总数
    int event_count_active;             // 活跃事件总数

    struct event_list eventqueue;       // 存储所有事件
    struct event_io_map io;             // 存储I/O事件
    struct event_signal_map sigmap;     // 存储信号事件
    struct min_heap timeheap;           // 存储定时器事件
    struct event_list *activequeues;    // 存储激活事件
    int nactivequeues;                  // 激活队列个数

    struct timeval event_tv;
    struct timeval tv_cache;

    void *th_base_lock;

    int is_notify_pending;
    evutil_socket_t th_notify_fd[2];
    struct event th_notify;
    int (*th_notify_fn)(struct event_base *base);

    ...
};

evsel主要描述libevent的底层实现机制,linux系统对应epoll。

/** Structure to define the backend of a given event_base. */
struct eventop {
    const char *name;
    void *(*init)(struct event_base *);
    int (*add)(struct event_base *, evutil_socket_t fd, short old, short events, void *fdinfo);
    int (*del)(struct event_base *, evutil_socket_t fd, short old, short events, void *fdinfo);
    int (*dispatch)(struct event_base *, struct timeval *);
    void (*dealloc)(struct event_base *);
    int need_reinit;
    enum event_method_feature features;
    size_t fdinfo_len;
};

const struct eventop epollops = {
    "epoll",
    epoll_init,
    epoll_nochangelist_add,
    epoll_nochangelist_del,
    epoll_dispatch,
    epoll_dealloc,
    1, /* need reinit */
    EV_FEATURE_ET|EV_FEATURE_O1,
    0
};

event_list是一个双向链表,min_heap是一个小根堆,而event_io_map结构有点复杂。

在linux系统,event_io_map就是event_signal_map,结构如下:

struct event_signal_map {
    void **entries; /* An array of evmap_io * or of evmap_signal */
    int nentries;
};

struct evmap_io {
    struct event_list events;
    ev_uint16_t nread;
    ev_uint16_t nwrite;
};

struct evmap_signal {
    struct event_list events;
};

一图胜千言:

可以看出,一个event_signal_map对应多个双向链表。同一个fd或signal的事件位于同一个链表中。

时间: 2024-10-08 17:11:04

libevent(三)event_base的相关文章

[libevent]event,event_base结构体描述

libevent的核心-event Libevent是基于事件驱动(event-driven)的,从名字也可以看到event是整个库的核心.event就是Reactor框架中的事件处理程序组件:它提供了函数接口,供Reactor在事件发生时调用,以执行相应的事件处理,通常它会绑定一个有效的句柄. //在event2/event_struct.h中event的结构描述 struct event { TAILQ_ENTRY (event) ev_next; /*增加下一个事件*/ TAILQ_ENT

libevent网络编程汇总

libevent源码剖析: ========================================================== 1.libevent源码剖析一(序) 2.libevent源码剖析二(Reactor框架) 3.libevent源码剖析三(基础使用) 4.libevent源码剖析四(代码组织) 5.libevent源码剖析五(核心:event) 6.libevent源码剖析六(事件处理:event_base) 7.libevent源码剖析七(事件主循环) 8.lib

libevent(了解)

1 前言 Libevent是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关文章也不少.写这一系列文章的用意在于,一则分享心得:二则对libevent代码和设计思想做系统的.更深层次的分析,写出来,也可供后来者参考. 附带一句:Libevent是用c语言编写的(MS大牛们都偏爱c语言哪),而且几乎是无处不函数指针,学习其源代码也需要相当的c语言基础. 2 LIBEVENT简介 上来当然要先夸奖啦,Libevent 有几个显著的亮点:事件驱动(event-driven),高性能;轻量级,

libevent源码剖析

libevent是一个使用C语言编写的,轻量级的开源高性能网络库,使用者很多,研究者也很多.由于代码简洁,设计思想简明巧妙,因此很适合用来学习,提升自己C语言的能力. libevent有这样显著地几个亮点: 1.事件驱动,高性能 2.轻量级,专注于网络,不如ACE那么庞大臃肿 3.代码精炼易读 4.跨平台,支持Windows,Linux,*BSD和Mac Os; 5.支持多种IO多路复用技术,epoll,poll,dev/poll.select和kqueue等 6.支持IO,定时器和信号等事件

libevent源码深度剖析八

libevent源码深度剖析八 --集成信号处理张亮 现在我们已经了解了libevent的基本框架:事件管理框架和事件主循环.上节提到了libevent中I/O事件和Signal以及Timer事件的集成,这一节将分析如何将Signal集成到事件主循环的框架中. 1 集成策略--使用socket pair 前一节已经做了足够多的介绍了,基本方法就是采用"消息机制".在libevent中这是通过socket pair完成的,下面就来详细分析一下.      Socket pair就是一个s

Libevent源码分析—event_init()

下面开始看初始化event_base结构的相关函数.相关源码位于event.c event_init() 首先调用event_init()初始化event_base结构体 struct event_base * event_init(void) { struct event_base *base = event_base_new(); //event_init()调用event_base_new() if (base != NULL) current_base = base; return (b

linux 服务器---FastDFS分布式文件服务器配置

一.先上传所需要的文件 通过SecureCRT连接服务器,使用sftp功能上传,文件上传后位于 /~目录下. 二.先安装libvent工具包 yum -y install libevent 三.安装libfastcommonV1.0.7工具包. 切换到~目录 ,然后解压缩 tar zxf libfastcommonV1.0.7.tar.gz 进入libfastcommonV1.0.7目录中,安装 cd libfastcommonV1.0.7 ./make.sh ./make.sh install

libevent学习三(Getting an event_base)

1.一个event_base持有了一系列的事件,并监控和决定哪些事件需要激活, 2.每一个event_base背后都有一个支持其工作的方法(诸如select,poll,epoll,kquene...),默认情况会选择最快的方法,可以自定义设置 3.event_base可以被设置为lock状态,这样多个线程可以并发安全访问,但是其事件循环只能运行在一个线程当中.如果多个线程需要检查io事件,那么必须要每个线程一个event_base. struct event_base *event_base_n

libevent源码深度剖析三

libevent源码深度剖析三 --libevent基本使用场景和事件流程张亮 1 前言 学习源代码该从哪里入手?我觉得从程序的基本使用场景和代码的整体处理流程入手是个不错的方法,至少从个人的经验上讲,用此方法分析libevent是比较有效的. 2 基本应用场景 基本应用场景也是使用libevnet的基本流程,下面来考虑一个最简单的场景,使用livevent设置定时器,应用程序只需要执行下面几个简单的步骤即可. 1)首先初始化libevent库,并保存返回的指针struct event_base