list_for_each_entry

内核的链表实现很灵活,经过在结构体中插入list,便可把结构体串成一个链表,而不是建立list,然后将结构体塞入list中。

那么如何经过遍历一个结构体list呢。由于实际的list,只是结构体中某个变量的list,须要经过该变量地址,计算得出结构体的地址,这样遍历了变量的时候,也就遍历告终构体。这就是list_for_each_entry所做的。code

list_for_each_entry

循环list对应的entry
#define list_for_each_entry(pos, head, member)                \
    for (pos = list_entry((head)->next, typeof(*pos), member);    \
          &pos->member != (head);     \
         pos = list_entry(pos->member.next, typeof(*pos), member))

该for循环能够当作三部分for循环

  1. pos = list_entry((head)->next, typeof(*pos), member); 初始化获取head->next对应list所在的entry
  2. 终止条件为entry->list != head
  3. 得到pos->member.next所在的entry

list_entry

根据list变量地址,获取entry的地址
#define list_entry(ptr, type, member) \
    container_of(ptr, type, member)

container_of(ptr, type, member)

ptr: list变量 type:entry对于的结构体类型 member:list在entry的名称
#define container_of(ptr, type, member) ({                      \
         typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})
本站公众号
   欢迎关注本站公众号,获取更多信息