栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Libevent库源码简单笔记

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Libevent库源码简单笔记

libevent库的主要逻辑: 1.调用event_init函数创建event_base对象,一个event_base相当于一个Reactor实例 2.创建具体的事件处理器(evsignal_new(信号事件)、evtimer_new(定时器事件)、event_new(通用事件))(信号和定时器事件的统一入口就是通用事件)**不是事件,事件是句柄上绑定的事件,比如文件描述符上的读写事件,事件处理器是包括了事件还有其他成员比如回调函数
struct event* event_new(struct event_base* base,evutil_socket_t fd,short events, void(*cb)(evutil_socket_t,short,void*),void* arg)
    
3.调用event_add函数进行注册(可以理解为epoll中的epoll_ctl(base,EPOLL_ADD,fd,*event)) 4.调用event_base_dispatch(可以理解为epoll_wait函数)函数执行事件循环 5.循环结束,*_free系列函数释放系统资源
event结构体源码
struct event{
    TAILQ_ENTRY(event) ev_active_next;//所有已经激活的事件串联成的尾队列(活动事件队列)
    TAILQ_ENTRY(event) ev_next;//所有已经注册的事件处理器串联成的一个尾队列(注册事件队列)
    union{
        TAILQ_ENTRY(event)ev_next_with_timeout;//指出该定时器在通用定时器队列中的位置
        int min_heap_idx;//定时器在时间堆中的位置
    }ev_timeout_pos;
    evutil_socket_t ev_fd;//句柄
    struct event_base* ev_base;//从属的event_base实例
    union{
        struct{
            TAILQ_ENTRY(event)ev_io_next;
            struct timeval ev_timeout;
        }ev_io;//io事件队列
        struct{
            TAILQ_ENTRY(event) ev_signal_next;
            short ev_ncalls;//信号到来调用多少次回调
            short* ev_pncalls;//指向ev_ncall或者为NULL
        }ev_signal;//信号事件队列
    }_ev;
    short ev_events;//事件类型P240
    short ev_res;//激活事件类型
    short ev_flags;//事件标志
    ev_uint8_t ev_pri;//事件优先级
    ev_uint8_t ev_closure;//回调函数行为
    struct timeval ev_timeout;//定时器超时值(仅对定时器事件处理器有效)
    void (*ev_callback)(evutil_socket_,short,void* arg);//回调函数(传入ev_fd,ev_res,ev_arg)
    void* ev_arg;//回调函数的参数
}




eventop结构体源码 eventop结构体封装了IO复用机制的一些必要操作,为event_base支持的所有后端IO复用机制提供了一个统一的接口,默认选择的技术是epoll
struct eventop{
    //后端IO复用技术的名称
    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 *);
    //释放IO复用机制使用的资源
    void (*dealloc)(struct event_base *);
    //程序调用fork后是否需要重新初始化
    int need_reinit;
    //IO复用技术支持的一些特性:边沿触发事件,事件检测算法复杂度O(1),监听其他类型的文件描述符上的事件
    enum event_method_feature features;
    //分配额外内存的长度
    size_t fdinfo_len;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/784091.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号