Kernel base Series(3)-----hlist_nulls_head

分类:

原文地址:Kernel base Series(3)-----hlist_nulls_head 作者:mtloveft

声明:本文为原创
#####请转贴时保留以下内容######
作者GTT
本文档归属 http://oldtown.cublog.cn/.转载请注明出处!
请提出宝贵意见Mail:mtloveft@hotmail.com
Linux Version: 2.6.33
提示 本文是介绍一些linux kernel 基础数据结构系列
普通的hash表遍历时,退出条件就是节点元素等于NULL。
有没有其他退出条件呢?那就是hlist_nulls_head
 
定义如下

struct hlist_nulls_head {
    struct hlist_nulls_node *first;
};

struct hlist_nulls_node {
    struct hlist_nulls_node *next, **pprev;
};

 
初始化过程如下,必须给定一个nulls其实就是按照顺序给定的int值
最后的安排如上图,nulls不是随便给的值

#define INIT_HLIST_NULLS_HEAD(ptr, nulls) \
 ((ptr)->first = (struct hlist_nulls_node *) (1UL | (((long)nulls) << 1)))

运算后first指针的值为1, 3, 5, 7, 9...
 
判断一个hlist_nulls_node是否是一个nulls就是下面的方法

static inline int is_a_nulls(const struct hlist_nulls_node *ptr)
{
    return ((unsigned long)ptr & 1);
}

 
遍历的方法是

#define hlist_nulls_for_each_entry(tpos, pos, head, member) \
 for (pos = (head)->first; \
      (!is_a_nulls(pos)) && \
  ({ tpos = hlist_nulls_entry(pos, typeof(*tpos), member); 1;}); \
      pos = pos->next)

 
退出条件就是pos是否是一个nulls,
hlist_nulls_for_each_entry的参数说明如下
tpos就是我们hlist_nulls_node所属的结构体的指针
pos 是hlist_nulls_node结构指针
head是根据hash值得到的hash表里的一项hlist_nulls_head 
member 是hlist_nulls_node在所属结构体里的定义名称
这个hash表和上一篇的区别就在于退出条件。
 
hlist_nulls_node的构成图如下
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值