#define list_entry(ptr, type, member) ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) |
用于获取一个节点所在结构体的起始地址。 |
static inline int list_entry_is_head(const struct list_head *entry, const struct list_head *head) { return entry->prev == head; } |
用于判断给定节点是否为链表头。 |
#define list_first_entry(ptr, type, member) list_entry((ptr)->next, type, member) |
用于获取链表中第一个节点所在结构体的起始地址。 |
#define list_first_entry_or_null(ptr, type, member) ({ struct list_head *__head = (ptr); struct list_head *__pos = __head->next; __pos != __head ? list_entry(__pos, type, member) : NULL; }) |
用于获取链表中第一个节点所在结构体的起始地址,但会先检查链表是否为空,以避免对空指针进行解引用。 |
#define list_next_entry(pos, member) list_entry((pos)->member.next, typeof(*(pos)), member) |
用于获取链表中紧随给定节点之后的节点所在结构体的起始地址。 |
#define list_last_entry(ptr, type, member) list_entry((ptr)->prev, type, member) |
用于获取链表中最后一个节点所在结构体的起始地址。 |
#define list_prepare_entry(pos, ptr, member) ((pos) ? : list_entry(ptr, typeof(*pos), member)) |
用于准备一个节点的数据结构指针。如果该指针为NULL,则将其初始化为链表的头部。 |
#define list_prev_entry(pos, member) list_entry((pos)->member.prev, typeof(*(pos)), member) |
用于获取链表中紧靠给定节点之前的节点所在结构体的起始地址。 |
#define list_for_each(pos, head) for (pos = (head)->next; pos != (head); pos = pos->next) |
遍历链表中的所有节点 |
#define list_for_each_continue(pos, head) for (pos = pos->next; pos != (head); pos = pos->next) |
从当前节点继续遍历链表中的剩余节点。 |
#define list_for_each_prev(pos, head) for (pos = (head)->prev; pos != (head); pos = pos->prev) |
从链表尾部开始遍历所有节点。 |
#define list_for_each_safe(pos, n, head) for (pos = (head)->next, n = pos->next; pos != (head); pos = n, n = pos->next) |
与list_for_each函数类似,但允许在遍历过程中删除或添加节点。其中,n参数表示要处理的下一个节点。 |
#define list_for_each_prev_safe(pos, n, head) for (pos = (head)->prev, n = pos->prev; pos != (head); pos = n, n = pos->prev) |
与list_for_each_safe函数类似,但遍历顺序是从链表尾部开始。 |
#define list_for_each_entry(pos, head, member) for (pos = list_first_entry(head, typeof(*pos), member); &pos->member != (head); pos = list_next_entry(pos, member)) |
用于在遍历链表时,获取每个节点所在结构体的起始地址。其中,pos参数表示当前节点所在结构体的指针;head参数表示要遍历的链表头部指针;member参数表示每个节点在结构体中的成员名称。 |
#define list_for_each_entry_reverse(pos, head, member) for (pos = list_last_entry(head, typeof(*pos), member); &pos->member != (head); pos = list_prev_entry(pos, member)) |
与list_for_each_entry函数类似,但遍历顺序是从链表尾部开始。 |
#define list_for_each_entry_continue(pos, head, member) for (pos = list_next_entry(pos, member); &pos->member != (head); pos = list_next_entry(pos, member)) |
用于从当前节点继续往后遍历链表,并获取每个节点所在结构体的起始地址。 |
#define list_for_each_entry_continue_reverse(pos, head, member) for (pos = list_prev_entry(pos, member); &pos->member != (head); pos = list_prev_entry(pos, member)) |
与list_for_each_entry_continue函数类似,但遍历顺序是从链表尾部开始。 |
#define list_for_each_entry_from(pos, head, member) for (; &pos->member != (head); pos = list_next_entry(pos, member)) |
用于从某个节点开始遍历链表,并获取每个节点所在结构体的起始地址。其中,pos参数表示当前要遍历的节点所在结构体的指针;head参数表示要遍历的链表头部指针;member参数表示每个节点在结构体中的成员名称。 |
#define list_for_each_entry_from_reverse(pos, head, member) for (; &pos->member != (head); pos = list_prev_entry(pos, member)) |
与list_for_each_entry_from函数类似,但遍历顺序是从链表尾部开始。 |
#define list_for_each_entry_safe(pos, n, head, member) for (pos = list_first_entry(head, typeof(*pos), member), n = list_next_entry(pos, member); &pos->member != (head); pos = n, n = list_next_entry(n, member)) |
与list_for_each_entry函数类似,但允许在遍历过程中删除或添加节点。其中,n参数表示要处理的下一个节点。 |
#define list_for_each_entry_safe_continue(pos, n, head, member) for (pos = list_next_entry(pos, member), n = list_next_entry(pos, member); &pos->member != (head); pos = n, n = list_next_entry(n, member)) |
用于从当前节点继续往后遍历链表,并允许在遍历过程中删除或添加节点。 |
#define list_for_each_entry_safe_from(pos, n, head, member) for (n = list_next_entry(pos, member); &pos->member != (head); pos = n, n = list_next_entry(n, member)) |
用于从某个节点开始遍历链表,并允许在遍历过程中删除或添加节点。 |
#define list_for_each_entry_safe_reverse(pos, n, head, member) for (pos = list_last_entry(head, typeof(*pos), member), n = list_prev_entry(pos, member); &pos->member != (head); pos = n, n = list_prev_entry(n, member)) |
与list_for_each_entry_reverse函数类似,但允许在遍历过程中删除或添加节点。 |
#define list_is_first(pos, head) ((pos)->prev == (head)) |
用于检查当前节点是否为链表中的第一个节点。其中,pos 参数表示要检查的节点指针;head 参数表示链表头部指针。 |
#define list_is_last(pos, head) ((pos)->next == (head)) |
用于检查当前节点是否为链表中的最后一个节点。其中,pos 参数表示要检查的节点指针;head 参数表示链表头部指针。 |
#define list_is_head(pos, head) ((pos) == (head)) |
用于检查当前节点是否为链表头部。其中,pos参数表示要检查的节点指针;head参数表示链表头部指针。 |
#define list_is_singular(head) (!list_empty(head) && ((head)->next == (head)->prev)) |
用于检查链表中是否只有一个节点。其中,head参数表示链表头部指针。 |
#define list_safe_reset_next(curr, next, member) next = list_entry((curr)->member.next, typeof(*curr), member) |
用于安全地重置一个节点的后继节点指针,以便在遍历链表时删除当前节点。其中,curr 参数表示当前节点指针;next 参数表示当前节点的后继节点指针;member 参数表示节点结构体中 struct list_head 成员的名称。 |