zoukankan      html  css  js  c++  java
  • libevent核心event和event_base结构体

    参考:http://blog.csdn.net/yusiguyuan/article/category/2171081/2

      http://blog.csdn.net/sparkliang/article/category/660506

    一。event结构体

    struct event {  
     TAILQ_ENTRY (event) ev_next;  
     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;  
     short *ev_pncalls; /* 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;  
     int ev_res;  /* result passed to event callback */  
     int ev_flags;  
    };  
    

      1)event结构体中有三个双向链表。ev_next保存的是I/O已注册事件,ev_signal_next保存signal已注册事件,ev_active_next保存已激活事件

      2)min_heap_idx和ev_timeout管理timeout事件,libevent使用小堆来管理定时事件

      3)event_base是reactor反应堆实例,之后再写

      4)ev_fd,对于windows来说就是所绑定的句柄,对于I/O事件,是绑定的文件描述符;对于signal事件,是绑定的信号

      5)ev_callback,实际事件发生时的回调函数

    上图可看出libevent对event的管理

    二.event_base结构体

    struct event_base {  
     const struct eventop *evsel;  
     void *evbase;   
     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;  
     int nactivequeues;  
     /* signal handling info */  
     struct evsignal_info sig;  
     struct event_list eventqueue;  
     struct timeval event_tv;  
     struct min_heap timeheap;  
     struct timeval tv_cache;  
    }; 

      1)struct eventop是对系统提供的I/O demultiplex机制的统一封装,其中包含了包含了select、poll、kequeue和epoll等等其中的若干个全局实例对象。这里evbase和evsel一般都指代符合当前系统的后端函数,一般是这么用的evsel->add(evbase, ev),实际执行的是evbase

      2)activequeues是一个二级指针,是管理激活事件的,当作数组时,activequeues[priority]是一个链表,链表的每个节点指向一个优先级为priority的就绪事件event

      3)eventqueue  链表,保存了所有的注册事件event的指针

      4)sig是由来管理信号的结构体

      5)timeheap是管理定时事件的最小堆

  • 相关阅读:
    Asp.net MVC FluentHTML and Fluent Interface
    Linux上安装Sybase
    Oracle PL/SQL开发利器Toad应用总结(一)PL/SQL Program基本编写、调试
    ELMAH——可插拔错误日志工具
    用SQLMonitor监视SQL*Net
    如何得到自增id值
    SQL Server ID自增列重新从1开始算起
    加载TreeView并设置复选框
    编程设置最小化、最大化、关闭按钮 相关讨论
    在 VB.NET 编程中使用数组
  • 原文地址:https://www.cnblogs.com/wangshaowei/p/8545650.html
Copyright © 2011-2022 走看看