发新话题
打印

关于内核中hlist结构的疑问

关于内核中hlist结构的疑问

我们知道,内核list的结构大致如下

struct list_head {
struct list_head *prev, *next;
};

这样一个小巧简单的链表,可以直接嵌入在其他自定义结构中,并且通过一个container_of(basetype, ptr)这样的宏,能找回所在的结构地址(通过ptr本身的大小和它的偏移量)。节点都是双头的,操作提来很方便。
而我觉得奇怪的是,为什么hlist的双头会是另外一个样子的。hlist的定义大致如下:

struct hlist_head {
struct hlist_node *first;
};

上面这个链表头用于指向一个下面这样的链表节点:

struct hlist_node {
struct hlist_node *next;
struct hlist_node **pprev;
};

对于hlist_node,除了正常的next指针以外,只有一个指向 "上一个节点->next" 的指针,以此来操作上一个节点的next指针--- 对于这一点,我的疑问是,为什么不直接使用 struct hlist_node *prev 来指向上一个节点? 这样的话,使用 prev->next 也能达到 **pprev 的效果啊?
Fluke's Blog
I'm a user.
个人认为这种情况比较规整
可以全衡结构复杂性与操作复杂性,做一些适当分离,便于扩展
对于系统软件这种考虑是有道理的
要求结构清晰

[ 本帖最后由 黄富强 于 2007-9-7 15:40 编辑 ]
内核的通用链表本身确实很有通用性。看了觉得很有收获啊。

有时间继续研究内核:)
Fluke's Blog
I'm a user.
在list中,表头和节点是同一个数据结构,直接用prev没问题;在hlist中,表头没有prev,也没有next,只有一个first。为了能统一地修改表头的first指针,即表头的first指针必须修改指向新插入的节点,hlist就设计了pprev。hlist节点的pprev不再是指向前一个节点的指针,而是指向
前一个节点(可能是表头)中的next(对于表头则是first)指针(struct list_head **pprev),从而在表头插入的操作可以通过一致的
“*(node->pprev)”访问和修改前节点的next(或first)指针。
重哼 大家好我想说一个发生在我身上的离奇故事 相信他的人可以当作一个很好的见识 不相信认为我胡言胡语的人可以当作是一个
有趣的故事
   我一直认为随着世界经济的快速增长尤其是改革开放给中国带来更新换貌的时候 人们对法律的认识和自觉应该更有所提高
然而发生在我身边的事情让我改变拉想法
   在我身边有这样一个组织 他们每天的工作是通过极其特殊的手段让一个人自我沮丧 绝望 发狂 同时也保证他的偶尔快乐得意
而他们所实行的方法不是毒打当然也有 而是通过人对声音敏感这是主要 其次利用周围人的极速变化来彻底的让人不能自拔 痛不
欲生
   有时你走在街上 许多人莫名其妙的走过来就是一重哼 甚至走到你旁边说什么“小心啊 别这样啊 会后悔阿“躲到家里不是
楼上楼下的巨响就是门外楼底有人巨哼 有时一天你能听到上百的重哼 除非你潜意识的按他们要求做 有时偶尔一天 2天他们
会少让你痛苦些
   我力图上访过 也在网站发出过类似的文章都无效 也去过公安局他们让我去看医生 但是到现在我仍然处于无时不惊恐和沮丧
甚至绝望 除拉有7-9小时的休息时间和偶尔一时快乐得意 每天平均至少有3-9小时的沮丧和痛苦 有时就是一2天甚至一周的不安
与怨恨
   我知道我活得不是最惨的最痛苦的 问题在于这是一种另类新的犯罪 我认为除拉我之外应该还有3-7人有类似经历的受害者
我真的不想时不时活在被威胁利用的生活中  更不想让一群这样唯利是图的组织迫害和利用他人而达到他们的多从目的 尽管
他们时常说他们捐款 信教
   如果真的没有一个人相信我的所说 换来得不是一条人命而是犯罪组织的利益
发新话题