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) );})
本站公眾號
   歡迎關注本站公眾號,獲取更多信息