0001
0002 #ifndef LIST_H
0003 #define LIST_H
0004
0005 #include <stdbool.h>
0006 #include <stddef.h>
0007
0008
0009 #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
0010
0011
0012
0013
0014
0015
0016
0017
0018 #define container_of(ptr, type, member) ({ \
0019 void *__mptr = (void *)(ptr); \
0020 _Static_assert(__same_type(*(ptr), ((type *)0)->member) || \
0021 __same_type(*(ptr), void), \
0022 "pointer type mismatch in container_of()"); \
0023 ((type *)(__mptr - offsetof(type, member))); })
0024
0025 #define LIST_POISON1 ((void *) 0x100)
0026 #define LIST_POISON2 ((void *) 0x122)
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 struct list_head {
0039 struct list_head *next, *prev;
0040 };
0041
0042 #define LIST_HEAD_INIT(name) { &(name), &(name) }
0043
0044 #define LIST_HEAD(name) \
0045 struct list_head name = LIST_HEAD_INIT(name)
0046
0047
0048
0049
0050
0051
0052
0053
0054 static inline void INIT_LIST_HEAD(struct list_head *list)
0055 {
0056 list->next = list;
0057 list->prev = list;
0058 }
0059
0060
0061
0062
0063
0064
0065
0066 static inline void __list_add(struct list_head *new,
0067 struct list_head *prev,
0068 struct list_head *next)
0069 {
0070 next->prev = new;
0071 new->next = next;
0072 new->prev = prev;
0073 prev->next = new;
0074 }
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084 static inline void list_add(struct list_head *new, struct list_head *head)
0085 {
0086 __list_add(new, head, head->next);
0087 }
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097 static inline void list_add_tail(struct list_head *new, struct list_head *head)
0098 {
0099 __list_add(new, head->prev, head);
0100 }
0101
0102
0103
0104
0105
0106
0107
0108
0109 static inline void __list_del(struct list_head *prev, struct list_head *next)
0110 {
0111 next->prev = prev;
0112 prev->next = next;
0113 }
0114
0115 static inline void __list_del_entry(struct list_head *entry)
0116 {
0117 __list_del(entry->prev, entry->next);
0118 }
0119
0120
0121
0122
0123
0124
0125
0126 static inline void list_del(struct list_head *entry)
0127 {
0128 __list_del_entry(entry);
0129 entry->next = LIST_POISON1;
0130 entry->prev = LIST_POISON2;
0131 }
0132
0133
0134
0135
0136
0137
0138 static inline int list_is_head(const struct list_head *list, const struct list_head *head)
0139 {
0140 return list == head;
0141 }
0142
0143
0144
0145
0146
0147 static inline int list_empty(const struct list_head *head)
0148 {
0149 return head->next == head;
0150 }
0151
0152
0153
0154
0155
0156
0157
0158 #define list_entry(ptr, type, member) \
0159 container_of(ptr, type, member)
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169 #define list_first_entry(ptr, type, member) \
0170 list_entry((ptr)->next, type, member)
0171
0172
0173
0174
0175
0176
0177 #define list_next_entry(pos, member) \
0178 list_entry((pos)->member.next, typeof(*(pos)), member)
0179
0180
0181
0182
0183
0184
0185
0186 #define list_entry_is_head(pos, head, member) \
0187 (&pos->member == (head))
0188
0189
0190
0191
0192
0193
0194
0195 #define list_for_each_entry(pos, head, member) \
0196 for (pos = list_first_entry(head, typeof(*pos), member); \
0197 !list_entry_is_head(pos, head, member); \
0198 pos = list_next_entry(pos, member))
0199
0200
0201
0202
0203
0204
0205
0206
0207 #define list_for_each_entry_safe(pos, n, head, member) \
0208 for (pos = list_first_entry(head, typeof(*pos), member), \
0209 n = list_next_entry(pos, member); \
0210 !list_entry_is_head(pos, head, member); \
0211 pos = n, n = list_next_entry(n, member))
0212
0213 #endif