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结构体

上图可看出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是管理定时事件的最小堆

原文链接: https://www.cnblogs.com/wangshaowei/p/8545650.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    libevent核心-event和event_base结构体

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/392040

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月31日 上午10:53
下一篇 2023年3月31日 上午10:53

相关推荐