关于Linux代码中链表的一个疑问
static inline void hlist_add_head_rcu(struct hlist_node *n,
struct hlist_head *h)
{
struct hlist_node *first = h->first;
n->next = first;
n->pprev = &h->first;
smp_wmb();
if (first)
first->pprev = &n->next;
h->first = n;
}
其中hlist_node以及hlist_head结构定义如下:
struct hlist_head {
struct hlist_node *first;
};
struct hlist_node {
struct hlist_node *next, **pprev;
};
疑问:
(1)代码中这两句没看懂,n->next = first是将n插入到first指针之前,也就是队列的最前面。那么第二句应该是n->pprev=&first->first,即n的前驱指向first的前驱。为何是n->pprev = &h->first;
n->next = first;
n->pprev = &h->first;
(2)struct hlist_node *next, **pprev; pprev为何要定义成二级指针,意义何在?
(3)if (first)
first->pprev = &n->next;
这个感觉应该是first->pprev=&n才是,为啥啊是指向n->next?
[解决办法]
参考一下下面的链接:
http://blog.sina.com.cn/s/blog_508d2c500100gdnp.html
http://www.model.in.tum.de/~joba/vmcai10.pdf
[解决办法]
这是个散列表操作不是纯粹的链表,内核中纯粹的链表结构是
struct list_head {
18 struct list_head *next, *prev;
19 };