event_base中的io变量是类型为event_io_map的结构体,其定义如下:
HT_HEAD(event_io_map, event_map_entry);
即
structname
{
//哈希表
struct event_map_entry **hth_table;
//哈希表长度
unsigned hth_table_length;
//实际存储的要素个数
unsigned hth_n_entries;
//存储增长上限
unsigned hth_load_limit;
//哈希表长度在素数表中的位置
int hth_prime_idx;
};
event_map_entry是哈希表的要素类型,其定义如下
structevent_map_entry
{
struct
{
struct type *hte_next;
}map_node ;
evutil_socket_t fd;
union
{
struct evmap_io evmap_io;
}ent;
};
结构体evmap_io是该要素的主要存储结构体,其定义如下:
structevmap_io
{
//所有的注册在一个fd上的事件列表
struct event_list events;
//读事件的个数
ev_uint16_tnread;
//写事件的个数
ev_uint16_tnwrite;
};
event_list,是一个event的列表定义,具体使用方法见前面的文章。
通过evmap.c 中的evmap_io_add方法,将一个事件增加到io对象中,在evmap_io_add方法中有一个GET_IO_SLOT_AND_CTOR宏定义,该宏定义内部新创建并初始化一个event_map_entry,并通过一个哈希算法将该对象存放到哈希表一个合适的位置。之后通过TAILQ_INSERT_TAIL方法,将event对象附加到event的列表上。