libevent中,每一个base维护着自己的事件相关的结构体。对于处于非active状态的事件,base分为timer事件,信号事件和io时间分别维护。其中timer事件放在timeheap中,io事件放在io中,信号事件放在sigmap中。timeheap是一个最小堆,io则是一个文件描述符和io对象的哈希表。
timeheap相关的定义为:min_heap就是min_heap_t,定义在minheap-internal.h的第38行。min_heap_t采用数组的方式来存储,min_heap_t中a为最小堆分配的空间数目,n为最小堆中元素的数目。
io相关的定义为:event_io_map定义在event-internal.h 115行。event_map_entry定义在evmap.c的77行,evmap_io定义在evmap.c的57行,HT_ENTRY定义在ht-internal.h的29行,HT_HEAD定义在ht-internal.h的11行。所以综合起来event_io_map的定义为
struct event_io_map {
/* The hash table itself. */
// struct event_map_entry **hth_table;
struct event_map_entry {
//HT_ENTRY(event_map_entry)
struct {
struct event_map_entry *hte_next;
unsigned hte_hash;
} map_node;
evutil_socket_t fd;
union { /* This is a union in case we need to make more things that can
be in the hashtable. */
struct evmap_io evmap_io;
} ent;
} **hth_table;
/* How long is the hash table? */
unsigned hth_table_length;
/* How many elements does the table contain? */
unsigned hth_n_entries;
/* How many elements will we allow in the table before resizing it?
unsigned hth_load_limit;
/* Position of hth_table_length in the primes table. */
int hth_prime_idx;
}
event_io_map中的数据也是使用数组的方式来存储
base中的activequeues是存放激活的事件的队列,存储方式是链表
阅读(2365) | 评论(0) | 转发(0) |