libevent源码学习-第一天

来源:互联网 发布:摇头岭车神淘宝店地址 编辑:程序博客网 时间:2024/04/29 07:49
<event2/struct_event>


定义了<event.h>所需要的数据结构:struct event


#define TAILQ_ENTRY(type)
struct {
      struct  type  *tqe_next;
      struct  type  *tqe_pre;
}
#endif
可以指向任意类型的的一个双向列表节点,避免用户使用头文件<sys/queue.h>


libevent通过双向链表管理全部的事件,包括三个链表结构:I/O事件链表,保存I/O事件;激活事件链表,保存所有的激活事件,libevent通过遍历该链表执行调度;Signal事件列表,保存所有的信号事件。


struct  event{
      TAILQ_ENTRY(event) ev_active_next;


      TAILQ_ENTRY(event) ev_next;


      union{
            TAILQ_ENTRY(event) ev_next_with_common_timeout;
            int min_heap_idx;
      }ev_timeout_pos;

      evutil_socket_t ev_fd;

      struct event_base* ev_base;

      union{
            struct{
                  TAILQ_ENTRY(event) ev_io_next;
                  struct timeval ev_timeout;
            }ev_io;


            struct{
                  TAILQ_ENTRY(event) ev_signal_next;
                  short ev_ncalls;
                  short* ev_pncalls;
            }ev_signal;
      }_ev;

      short ev_events;
      short ev_res;
      short ev_flags;
      ev_uint8_t ev_pri;
      ev_unit8_t ev_closure;
      struct timeval ev_timeout;
      void (*ev_callback)(evutil_socket_t, short, void* arg);
      void *ev_arg;
};


1. ev_next 和 ev_active_next
双向链表节点指针,ev_next指定当前I/O事件在“已注册事件链表”中的位置;ev_active_next指明当前事件在“激活事件链表”中的位置。


2. ev_timeout_pos(猜测)
用于管理超时事件,ev_next_with_common_timeout为事件在超时链表中的位置;min_heap_idx为其在管理超时事件的小根堆中的索引,当事件为超时事件时使用。


3. ev_fd
用于保存事件所对应的端口、文件句柄。对于I/O事件,其为绑定的文件描述符;对于signal事件,为绑定的信号。


4. ev_base
指明该事件所属的反应堆实例,每个base实际上是一个libevent实例。


5. _ev
第一个结构体由I/O事件使用,第二个结构体由signal事件使用。


6. ev_events
指定event关注的事件类型,可以是:I/O事件(EV_WRITE & EV_READ);定时事件(EV_TIMEOUT);signal事件(EV_SIGNAL);永久事件(EV_PERSIST)。


7. ev_res
传递给回调函数获取返回值


8. ev_flags
用于标记当前事件的状态,可能值:event在time堆中(EVLIST_TIMEOUT=0X01);event在已注册事件链表中(EVLIST_INSERTED=0X02);event在signal事件链表中(EVLIST_SIGNAL=0X04);event在激活链表中(EVLIST_ACTIVE=0X08);内部使用标记(EVLIST_INTERNAL=0X10);event已被初始化(EVLIST_INIT=0X80)。


9. ev_timeout
事件的超时值


10. ev_callback
event的回调函数,由ev_base调用,执行事件处理,其参数对应结构体中的ev_fd, ev_events,和arg


11. ev_arg
任意数据类型,作为ev_callback的输入参数,在设定event时指定。


12. ev_pri
指明事件的优先级,越小优先级越高。




该文件中同时包括事件的头指针结构
#define TAILQ_HEAD(name, type)
struct name{
      struct type *tqh_first;
      struct type **tqh_last;
}

#endif

TAILQ_HEAD(event_list, event);
原创粉丝点击