1#ifndef __VSF_LINUX_LIST_H__
2#define __VSF_LINUX_LIST_H__
10#define LIST_HEAD_INIT(__NAME) { &(__NAME), &(__NAME) }
11#define LIST_HEAD(__NAME) struct list_head __NAME = LIST_HEAD_INIT(__NAME)
13#define list_entry(ptr, type, member) vsf_container_of(ptr, type, member)
14#define list_first_entry(ptr, type, member) list_entry((ptr)->next, type, member)
15#define list_last_entry(ptr, type, member) list_entry((ptr)->prev, type, member)
16#define list_next_entry(pos, member) list_entry((pos)->member.next, typeof(*(pos)), member)
17#define list_next_entry_circular(pos, head, member) \
18 (list_is_last(&(pos)->member, head) ? list_first_entry(head, typeof(*(pos)), member) : list_next_entry(pos, member))
19#define list_prev_entry(pos, member) list_entry((pos)->member.prev, typeof(*(pos)), member)
20#define list_prev_entry_circular(pos, head, member) \
21 (list_is_first(&(pos)->member, head) ? list_last_entry(head, typeof(*(pos)), member) : list_prev_entry(pos, member))
22#define list_first_entry_or_null(ptr, type, member) ({ \
23 struct list_head *head__ = (ptr); \
24 struct list_head *pos__ = READ_ONCE(head__->next); \
25 pos__ != head__ ? list_entry(pos__, type, member) : NULL; \
27#define list_entry_is_head(pos, head, member) (&pos->member == (head))
29#define list_prepare_entry(pos, head, member) ((pos) ? : list_entry(head, typeof(*pos), member))
31#define list_for_each(pos, head) for (pos = (head)->next; !list_is_head(pos, (head)); pos = pos->next)
32#define list_for_each_continue(pos, head) for (pos = pos->next; !list_is_head(pos, (head)); pos = pos->next)
33#define list_for_each_prev(pos, head) for (pos = (head)->prev; !list_is_head(pos, (head)); pos = pos->prev)
34#define list_for_each_safe(pos, n, head) \
35 for (pos = (head)->next, n = pos->next; !list_is_head(pos, (head)); pos = n, n = pos->next)
36#define list_for_each_prev_safe(pos, n, head) \
37 for (pos = (head)->prev, n = pos->prev; !list_is_head(pos, (head)); pos = n, n = pos->prev)
38#define list_for_each_entry(pos, head, member) \
39 for (pos = list_first_entry(head, typeof(*pos), member); \
40 !list_entry_is_head(pos, head, member); \
41 pos = list_next_entry(pos, member))
42#define list_for_each_entry_reverse(pos, head, member) \
43 for (pos = list_last_entry(head, typeof(*pos), member); \
44 !list_entry_is_head(pos, head, member); \
45 pos = list_prev_entry(pos, member))
46#define list_for_each_entry_continue(pos, head, member) \
47 for (pos = list_next_entry(pos, member); \
48 !list_entry_is_head(pos, head, member); \
49 pos = list_next_entry(pos, member))
50#define list_for_each_entry_continue_reverse(pos, head, member) \
51 for (pos = list_prev_entry(pos, member); \
52 !list_entry_is_head(pos, head, member); \
53 pos = list_prev_entry(pos, member))
54#define list_for_each_entry_from(pos, head, member) \
55 for (; !list_entry_is_head(pos, head, member); pos = list_next_entry(pos, member))
56#define list_for_each_entry_from_reverse(pos, head, member) \
57 for (; !list_entry_is_head(pos, head, member); pos = list_prev_entry(pos, member))
58#define list_for_each_entry_safe(pos, n, head, member) \
59 for (pos = list_first_entry(head, typeof(*pos), member), \
60 n = list_next_entry(pos, member); \
61 !list_entry_is_head(pos, head, member); \
62 pos = n, n = list_next_entry(n, member))
63#define list_for_each_entry_safe_continue(pos, n, head, member) \
64 for (pos = list_next_entry(pos, member), n = list_next_entry(pos, member); \
65 !list_entry_is_head(pos, head, member); \
66 pos = n, n = list_next_entry(n, member))
67#define list_for_each_entry_safe_from(pos, n, head, member) \
68 for (n = list_next_entry(pos, member); \
69 !list_entry_is_head(pos, head, member); \
70 pos = n, n = list_next_entry(n, member))
71#define list_for_each_entry_safe_reverse(pos, n, head, member) \
72 for (pos = list_last_entry(head, typeof(*pos), member), \
73 n = list_prev_entry(pos, member); \
74 !list_entry_is_head(pos, head, member); \
75 pos = n, n = list_prev_entry(n, member))
81static inline void INIT_LIST_HEAD(
struct list_head *list)
102static inline int list_is_singular(
const struct list_head *
head)
122 list_insert(node,
head->prev,
head);
125static inline void list_del(
struct list_head *entry)
131static inline void list_del_init(
struct list_head *entry)
134 INIT_LIST_HEAD(entry);
struct esp_netif_obj * head
Definition esp_netif_port.c:117
struct esp_netif_obj * next
Definition esp_netif_port.c:81
struct list_head * prev
Definition list.h:78
struct list_head * next
Definition list.h:78
vsf_msgt_node_offset_t next
Definition vsf_msg_tree.h:192