52#if !defined(XF_LIST_POISON1)
53# define XF_LIST_POISON1 0x00100100
55#if !defined(XF_LIST_POISON2)
56# define XF_LIST_POISON2 0x00200200
82#define XF_LIST_HEAD_INIT(name) { &(name), &(name) }
87#define XF_LIST_HEAD(name) \
88 xf_list_t name = XF_LIST_HEAD_INIT(name)
326 return list->
next == head;
344 return head->
next == head;
427 head->
next = new_node_first;
428 new_node_first->
prev = head;
464 && (head->
next != entry && head != entry)) {
595#define xf_list_entry(ptr, type, member) \
596 xf_container_of(ptr, type, member)
617#define xf_list_first_entry(ptr, type, member) \
618 xf_list_entry((ptr)->next, type, member)
632#define xf_list_for_each(pos, head) \
633 for ((pos) = (head)->next; (pos) != (head); (pos) = (pos)->next)
652#define __xf_list_for_each(pos, head) \
653 for ((pos) = (head)->next; (pos) != (head); (pos) = (pos)->next)
667#define xf_list_for_each_prev(pos, head) \
668 for ((pos) = (head)->prev; (pos) != (head); (pos) = (pos)->prev)
684#define xf_list_for_each_safe(pos, n, head) \
685 for ((pos) = (head)->next, (n) = (pos)->next; (pos) != (head); \
686 (pos) = (n), (n) = (pos)->next)
702#define xf_list_for_each_prev_safe(pos, n, head) \
703 for ((pos) = (head)->prev, (n) = (pos)->prev; \
705 (pos) = (n), (n) = (pos)->prev)
732#define xf_list_for_each_entry(pos, head, type, member) \
733 for ((pos) = xf_list_entry((head)->next, type, member); \
734 &(pos)->member != (head); \
735 (pos) = xf_list_entry((pos)->member.next, type, member))
754#define xf_list_for_each_entry_reverse(pos, head, type, member) \
755 for ((pos) = xf_list_entry((head)->prev, type, member); \
756 &(pos)->member != (head); \
757 (pos) = xf_list_entry((pos)->member.prev, type, member))
779#define xf_list_prepare_entry(pos, head, type, member) \
780 ((pos) ? : xf_list_entry(head, type, member))
802#define xf_list_for_each_entry_continue(pos, head, type, member) \
803 for ((pos) = xf_list_entry((pos)->member.next, type, member); \
804 &(pos)->member != (head); \
805 (pos) = xf_list_entry((pos)->member.next, type, member))
827#define xf_list_for_each_entry_continue_reverse(pos, head, type, member) \
828 for ((pos) = xf_list_entry((pos)->member.prev, type, member); \
829 &(pos)->member != (head); \
830 (pos) = xf_list_entry((pos)->member.prev, type, member))
851#define xf_list_for_each_entry_from(pos, head, type, member) \
852 for (; &(pos)->member != (head); \
853 (pos) = xf_list_entry((pos)->member.next, type, member))
876#define xf_list_for_each_entry_safe(pos, n, head, type, member) \
877 for ((pos) = xf_list_entry((head)->next, type, member), \
878 (n) = xf_list_entry((pos)->member.next, type, member); \
879 &(pos)->member != (head); \
880 (pos) = (n), (n) = xf_list_entry(n->member.next, type, member))
906#define xf_list_for_each_entry_safe_continue(pos, n, head, type, member) \
907 for ((pos) = xf_list_entry((pos)->member.next, type, member), \
908 (n) = xf_list_entry((pos)->member.next, type, member); \
909 &(pos)->member != (head); \
910 (pos) = (n), (n) = xf_list_entry((n)->member.next, type, member))
936#define xf_list_for_each_entry_safe_from(pos, n, head, type, member) \
937 for ((n) = xf_list_entry((pos)->member.next, type, member); \
938 &(pos)->member != (head); \
939 (pos) = (n), (n) = xf_list_entry((n)->member.next, type, member))
965#define xf_list_for_each_entry_safe_reverse(pos, n, head, type, member) \
966 for ((pos) = xf_list_entry((head)->prev, type, member), \
967 (n) = xf_list_entry((pos)->member.prev, type, member); \
968 &(pos)->member != (head); \
969 (pos) = (n), (n) = xf_list_entry((n)->member.prev, type, member))
999#define xf_list_safe_reset_next(pos, n, type, member) \
1000 (n) = xf_list_entry((pos)->member.next, type, member)
static void xf_list_init(xf_list_t *list)
动态初始化链表.
static int xf_list_is_singular(const xf_list_t *head)
xf_list_is_singular - 测试链表是否只有一个节点.
static void xf_list_add_tail(xf_list_t *new_node, xf_list_t *head)
xf_list_add_tail - 在指定节点之前添加一个 new_node.
static void xf_list_del_init(xf_list_t *entry)
xf_list_del_init - 从链表中删除节点, 并重新初始化.
static void xf_list_splice(const xf_list_t *list, xf_list_t *head)
xf_list_splice - 连接两个链表, 这是为栈设计的.
static void __xf_list_splice(const xf_list_t *list, xf_list_t *prev, xf_list_t *next)
static void xf_list_cut_position(xf_list_t *list, xf_list_t *head, xf_list_t *entry)
xf_list_cut_position - 将链表切成两部分.
static void xf_list_replace(xf_list_t *old, xf_list_t *new_node)
xf_list_replace - 用 new_node 替换旧节点.
static int xf_list_empty(const xf_list_t *head)
xf_list_empty - 测试链表是否为空.
static void xf_list_splice_init(xf_list_t *list, xf_list_t *head)
xf_list_splice_init - 连接两个链表并重新初始化空链表.
static void __xf_list_add(xf_list_t *new_node, xf_list_t *prev, xf_list_t *next)
在两个已知的连续节点之间插入一个 new_node 节点.
static void xf_list_splice_tail(xf_list_t *list, xf_list_t *head)
xf_list_splice_tail - 连接两个链表, 每个链表都是一个队列
static void xf_list_splice_tail_init(xf_list_t *list, xf_list_t *head)
xf_list_splice_tail_init - 连接两个链表并重新初始化空链表.
static void xf_list_rotate_left(xf_list_t *head)
xf_list_rotate_left - 将链表向左旋转.
static void __xf_list_del_entry(xf_list_t *entry)
static void xf_list_move_tail(xf_list_t *list, xf_list_t *head)
xf_list_move_tail - 从一个链表中删除指定节点, 并添加为另一个链表的尾节点.
static int xf_list_empty_careful(const xf_list_t *head)
xf_list_empty_careful - 测试链表是否为空且未被修改.
static void xf_list_add(xf_list_t *new_node, xf_list_t *head)
xf_list_add - 在指定节点之后添加一个 new_node.
static int xf_list_is_last(const xf_list_t *list, const xf_list_t *head)
xf_list_is_last - 测试 list 是否是链表 head 中的最后一个节点.
static void xf_list_del(xf_list_t *entry)
xf_list_del - 从链表中删除节点.
static void xf_list_replace_init(xf_list_t *old, xf_list_t *new_node)
xf_list_replace_init - 用 new_node 替换旧节点, 并重新初始化旧节点.
static void __xf_list_cut_position(xf_list_t *list, xf_list_t *head, xf_list_t *entry)
static void xf_list_move(xf_list_t *list, xf_list_t *head)
xf_list_move - 从一个链表中删除指定节点, 并添加为另一个链表的头节点。.
static void __xf_list_del(xf_list_t *prev, xf_list_t *next)
删除链表节点(list entry), 使前一个/后一个节点相互指向.
struct xf_list_head * next
struct xf_list_head * prev