VPP bihash遍历代码分析(kv_16_8)
kv_16_8代码
// An highlighted block
void clib_bihash_foreach_key_value_pair_16_8 (clib_bihash_bucket_16_8* b, clib_bihash_foreach_key_value_pair_cb_16_8 cb, void* arg)
{
int i, j, k;
//hash桶,记录kvpair在heap的起始位置
cli_bihash_bucket_16_8_t* b;
//page数据结构,包含kvpair
cli_bihash_value_16_8_t* v;
for(i = 0; i <h->nbuckets; i++)
{
//获取hash桶信息
b = clib_bihash_get_bucket_16_8 (h, i);
//验证hash桶是否为空
if (clib_bihash_bucket_is_empty_16_8(b))
continue;
//取page地址
v = clib_bihash_get_value_16_8(h, b->offset);
//循环读取桶内每一page内的kvpair
for (j = 0;j<(1<<b->log2_pages);k++)
{
for(k = 0;k<BIHASH_KVP_PER_PAGE;k++)
{
if(clib_bihash_is_free_16_8(&v->kvp[k]))
continue;
if(BIHASH_WALK_STOP == cb(&v->kvp[k],arg))
return;
//防止回调函数删除了桶内最后一个kvpair
if(clib_bihash_bucket_is_empty_16_8(b))
goto doublebreak;
}
v++;
}
doublebreak:
;
}
}