}/* unlink inner qdiscs from dev->qdisc_list immediately */list_for_each_entry(cq, &cql,list)list_for_each_entry_safe(q, n, &qdisc->dev->qdisc_list,list)if(TC_H_MAJ(q->parent) == TC_H_MAJ(cq->handle)) {if(q->ops->cl_ops ==NULL) list_del_init(&q->list);elselist_m...
但是在writer端,我们可以避免使用list_for_each_entry_rcu(),而使用list_for_each_entry()。
对此,Linux提供了list_for_each_entry()宏,第一个参数为传入的遍历指针,指向宿主数据结构,第二个参数为链表头,为list_head结构,第三个参数为list_head结构在宿主结构中的成员名。 #define list_for_each_entry(pos, head, member) / for (pos = list_entry((head)->next, typeof(*pos), member); / ...
3.9. list_for_each_entry_safe 12 3.9.1. 定义 12 3.9.2. 作用 13 3.10. list_for_each_entry_reverse 13 3.10.1. 定义 13 3.10.2. 作用 13 3.11. list_for_each_entry_continue 13 3.11.1. 定义 13 3.11.2. 作用 13 3.11.3. 区别 13 3.12. list_for_each_safe_rcu 14 4. hlist(hash l...
然后介绍list_add,通过改变链表位置的问题引出list_for_each函数,然后为了获取容器结构地址,引出offsetof和container_of宏,并对内核链表设计原因作出了解释,一步步引导到list_for_each_entry,然后介绍list_del函数,通过在遍历时list_del链表的不安全行为,引出list_for_each_entry_safe函数,通过本文,我希望读者可以得到...
当然,调用者完全可以自己缓存next指针使遍历操作能够连贯起来,但为了编程的一致性,Linux链表仍然提供了两个对应于基本遍历操作的"_safe"接口:list_for_each_safe(pos, n, head)、list_for_each_entry_safe(pos, n, head, member),它们要求调用者另外提供一个与pos同类型的指针n,在for循环中暂存pos下一个节点...
综上所述,我们可以了解到list_for_each_entry的作用:所有包含list_head的数据结构,均可使用此方法遍历链表;list_head结构体不包含数据部分,使用该函数进行遍历链表节点,然后在循环体中,对链表的数据部分进行读写操作,这就是list_for_each_entry的共通性 通过对链表中list成员的遍历,即可定位到链表的相关节点,进而...
static inline void __list_add(struct list_head *newentry, struct list_head *prev, struct list_head *next) { next->prev = newentry; newentry->next = next; newentry->prev = prev; prev->next = newentry; } /** * 加入一个新的节点。
* @new: new entry to be added 被添加的新的条目 * @head: list head to add it after 新条目被添加到head之后 * * Insert a new entry after the specified head. 在某个节点之后新添加一个条目 * This is good for implementing stacks. 这个适用于实现栈 ...
我们说不能在foreach 中进行,但是使用普通的for 循环还是可以的,因为普通for 循环并没有用到Iterator ...