libevent源码学习_结构体

来源:互联网 发布:网络词爸爸是什么意思 编辑:程序博客网 时间:2024/03/29 15:54

核心的结构体分析

一:   Libevent是基于事件驱动(event-driven)的,从名字也可以看到event是整个库的核心。event就是Reactor框架中的事件处理程序组件;它提供了函数接口,供Reactor在事件发生时调用,以执行相应的事件处理,通常它会绑定一个有效的句柄。

其中的ev_fd  和 ev_callback函数指针是应用层需要实现的。 比如io事件中,ev_fd就是socket句柄,回调函数ev_callback的实现应该就是一个读或者写socket的函数。

用select或者epool作为管理事件的模型, 当该event的事件发生时,调用的就是这个回调函数。 

struct event {

        TAILQ_ENTRY (event) ev_next;        /*io事件在链表中的位置(已注册事件链表)*/
        TAILQ_ENTRY (event) ev_active_next; /*所有的激活事件放到该激活链表,通过遍历链表执行调度。 这是该事件在激活链表的位置 */
        TAILQ_ENTRY (event) ev_signal_next; /*信号事件在信号事件链表中的位置*/
        unsigned int min_heap_idx;          /* for managing timeouts   事件在小根堆中的索引*/
        struct event_base *ev_base;         /*该事件所属的反应堆*/
        int ev_fd;            /*文件描述符或者是信号*/
        short ev_events;      /*事件类型*/
        short ev_ncalls;      /*事件就绪时,调用回调函数的次数,一般都是1啦*/
        short *ev_pncalls;                /*指针,通常指向ev_ncalls或者为NULL;  Allows deletes in callback    */
        struct timeval ev_timeout;        /*事件的超时值*/
        int ev_pri;                       /* smaller numbers are higher priority */
        void (*ev_callback)(int, short, void *arg);  /*回调函数*/
        void *ev_arg;                     /*event初始化的时候指定的*/
        int ev_res;                        /* 记录当前激活事件的类型 result passed to event callback */
        int ev_flags;                      /*记录event信息的字段,表明当前的状态*/

};


二、event_base

event_base是libevent的处理框架,一个event_base事实上就是一个libevent的实例。

struct event_base {
        const struct eventop *evsel;  /*指明该event_base使用的是那个事件处理接口eventop*/
        void *evbase;                 /*通过在evsel的Init方法初始化时返回的指针,后面很多操作都需要用到它*/
        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 */
        /* active event management */
        struct event_list **activequeues; /*二级指针根据优先级把激活的event存放到对应的链表*/
        int nactivequeues;  
        /* signal handling info */
        struct evsignal_info sig;  /*专门用于管理信号*/
        struct event_list eventqueue; /*链表,保存了所有的注册事件event的指针。*/
        struct timeval event_tv;
        struct min_heap timeheap;  /*管理定时事件的小根堆*/
        struct timeval tv_cache;
};


三、eventop

该结构体是io多路复用的封装,不管使用哪种复用机制,只要实现这些接口即可。   通过这些函数指针能管理该事件的添加、删除、分发处理等。

有点像基类 (或者是接口)
struct eventop {
        const char *name;
        void *(*init)(struct event_base *);
        int (*add)(void *, struct event *);
        int (*del)(void *, struct event *);
        int (*dispatch)(struct event_base *, void *, struct timeval *);
        void (*dealloc)(struct event_base *, void *);
        /* set if we need to reinitialize the event base */
        int need_reinit;
};