Libevent分解之数据结构 哈希表

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的列表上。

 

你可能感兴趣的:(c,libevent,c,数据结构)