11#ifndef __TBOX_LIST_H__
12#define __TBOX_LIST_H__
16#define tbox_typeof(x) __typeof__(x)
34static inline void prefetch(
const void* x)
44static inline void prefetchw(
const void* x)
49#define LIST_POISON1 ((void*)0x00100100)
50#define LIST_POISON2 ((void*)0x00200200)
68#define DLIST_HEAD_IN_STRUCT_INIT(field) \
71 (field).next = &(field); \
72 (field).prev = &(field); \
80#define DLIST_HEAD_INIT(name) {&(name), &(name)}
87#define DLIST_HEAD(name) struct list_node name = DLIST_HEAD_INIT(name)
94static inline void INIT_LIST_HEAD(
struct list_node* list)
106static inline int list_empty(
const struct list_node* head)
108 return ((head->
next == head) && (head->
prev == head));
121 new_node->
prev = existing;
122 existing->
next = new_node;
131static inline void list_prepend(
struct list_node* new_node,
struct list_node* existing)
134 new_node->
next = existing;
136 existing->
prev = new_node;
166 __list_add(new_node, head, head->
next);
179 __list_add(new_node, head->
prev, head);
187static inline void list_unlink(
struct list_node* entry)
216static inline void list_del(
struct list_node* list)
228#define container_of(ptr, type, member) \
230 const tbox_typeof(((type*)0)->member)* __mptr = (ptr); \
231 (type*)((char*)__mptr - offsetof(type, member)); \
241#define list_entry(ptr, type, member) container_of(ptr, type, member)
251#define list_for_each(pos, head) for (pos = (head)->next; prefetch(pos->next), pos != (head); pos = pos->next)
262#define list_for_each_entry(pos, head, member) \
263 for (pos = list_entry((head)->next, tbox_typeof(*pos), member); &pos->member != (head); \
264 pos = list_entry(pos->member.next, tbox_typeof(*pos), member))
276#define list_for_each_entry_safe(pos, n, head, member) \
277 for (pos = list_entry((head)->next, tbox_typeof(*pos), member), \
278 n = list_entry(pos->member.next, tbox_typeof(*pos), member); \
279 &pos->member != (head); pos = n, n = list_entry(n->member.next, tbox_typeof(*n), member))
305#define HLIST_HEAD_INIT {.first = NULL}
312#define HLIST_HEAD(name) struct hlist_head name = {.first = NULL}
319#define INIT_HLIST_HEAD(ptr) ((ptr)->first = NULL)
326#define INIT_HLIST_NODE(ptr) \
329 (ptr)->next = NULL; \
330 (ptr)->pprev = NULL; \
339static inline int hlist_unhashed(
const struct hlist_node* h)
350static inline int hlist_empty(
const struct hlist_head* h)
362static inline void __hlist_del(
struct hlist_node* n)
381static inline void hlist_del(
struct hlist_node* n)
393static inline void hlist_del_init(
struct hlist_node* n)
415 first->pprev = &n->next;
418 n->pprev = &h->first;
429 n->pprev = next->pprev;
431 next->pprev = &n->next;
445 next->next = n->next;
447 next->pprev = &n->next;
450 next->next->pprev = &next->next;
461#define hlist_entry(ptr, type, member) container_of(ptr, type, member)
471#define hlist_for_each(pos, head) \
472 for (pos = (head)->first; pos && ({ \
473 prefetch(pos->next); \
487#define hlist_for_each_safe(pos, n, head) \
488 for (pos = (head)->first; pos && ({ \
504#define hlist_for_each_entry(tpos, pos, head, member) \
505 for (pos = (head)->first; pos && ({ \
506 prefetch(pos->next); \
510 tpos = hlist_entry(pos, tbox_typeof(*tpos), member); \
522#define hlist_for_each_entry_continue(tpos, pos, member) \
523 for (pos = (pos)->next; pos && ({ \
524 prefetch(pos->next); \
528 tpos = hlist_entry(pos, tbox_typeof(*tpos), member); \
540#define hlist_for_each_entry_from(tpos, pos, member) \
542 prefetch(pos->next); \
546 tpos = hlist_entry(pos, tbox_typeof(*tpos), member); \
562#define hlist_for_each_entry_safe(tpos, pos, n, head, member) \
563 for (pos = (head)->first; pos && ({ \
568 tpos = hlist_entry(pos, tbox_typeof(*tpos), member); \
#define LIST_POISON2
链表删除后的 prev/pprev poison 值。
Definition list.h:50
struct list_node list_node_t
双向循环链表节点。
#define LIST_POISON1
链表删除后的 next poison 值。
Definition list.h:49
#define INIT_HLIST_NODE(ptr)
初始化 hlist 节点为未挂链状态。
Definition list.h:326
hlist 链表头。
Definition list.h:287
hlist 节点。
Definition list.h:297
双向循环链表节点。
Definition list.h:58
struct list_node * next
下一个节点。
Definition list.h:59
struct list_node * prev
前一个节点。
Definition list.h:60