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是管理定时事件的最小堆

  • 相关阅读:
    Binder核心原理解析
    写给 Android 应用工程师的 Binder 原理剖析
    Android Binder原理解析
    Android面试题(25)-Bundle机制_pgg_cold的博客-CSDN博客_android bundle机制
    腾讯Android面试精选题——谈一谈Binder的原理和实现一次拷贝的流程
    把这份关于Android Binder原理一系列笔记研究完,进大厂是个“加分项”...
    大型项目必备IPC之其他IPC方式(二)
    骚年!用Binder原理去彻底征服Android大厂面试官吧
    还不懂Binder的原理?那么你即将损失一张腾讯的offer
    每日一问 Binder
  • 原文地址:https://www.cnblogs.com/wangshaowei/p/8545650.html
Copyright © 2011-2022 走看看