前段时间对Libevent的源码进行了阅读,现整理如下:

介绍

libevent是一个轻量级的开源高性能事件驱动网络库,是一个典型的Reactor模型。其主要特点有事件驱动,高性能,跨平台,统一事件源等等。
网上关于libevent的源码分析有很多相关博客,本人在学习过程中也是借助了网络。所以,在此,关于libevent中的许多具体实现部分就不做介绍,主要是从相关数据结构层面上去分析。仅供参考。

event结构体

  • libevent中的事件处理类型是event结构类型,event结构体封装了句柄,事件类型,回调函数,以及其他必要的标志和数据,是整个libevent库的核心。

  • 该结构的定义如下:

    struct event{    /*     * ev_next, ev_active_next都是双向链表节点指针     * 它们是libevent对不同事件类型和在不同时期,对事件的管理时使用到的字段     *     * libevent使用双向链表保存所有注册的IO和signal事件     * ev_next 就是该IO事件在链表中的位置,称此链表为已注册事件链表     * ev_active_next: libevent将所有激活事件放入链表active list中,然后遍历active list     * 执行调度,ev_active_next就指明了event在active list中的位置     */
        TAILQ_ENTRY(event) ev_next;
        TAILQ_ENTRY(event) ev_active_next;    /*     * _ev 是一个联合体,所有具有相同描述符的IO事件通过ev.ev_io.ev_io_next成员串联成一个     * 尾队列,称之为IO事件队列,所有具有相同信号值的信号事件通过ev.ev_signal.ev_signal_next     * 串联成一个尾队列,称之为信号事件队列。ev.ev_signal.ev_ncalls成员指定时间发生时,Reactor     * 需要执行多少次该事件对应的回调函数,ev.ev_signal.ev_pcalls要么是NULL,要么执行ev.ev_signal.ev_ncalls     */
        union{        struct {
                TAILQ_ENTRY(event) ev_io_next;            struct timeval ev_timeout;
            }ev_io;        struct {
                TAILQ_ENTRY(even
            
    		

    网友评论