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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值