#ifndef __LIST__H__ typedef struct list_s { struct list_s *prev; struct list_s *next; } list_t; #define LIST_INIT(x) { &(x), &(x) } #define LIST_HEAD(x) list_t x = LIST_INIT(x) static inline void list_init(list_t *list) { list->prev = list; list->next = list; } static inline void list_del(list_t *list) { list_t *next, *prev; prev = list->prev; next = list->next; prev->next = next; next->prev = prev; } static inline void list_add(list_t *node, list_t *head) { list_t *last = head->next; node->next = last; last->prev = node; node->prev = head; head->next = node; } static inline void list_add_tail(list_t *node, list_t *head) { list_t *last = head->prev; node->prev = last; last->next = node; node->next = head; head->prev = node; } static inline list_t *list_next(list_t *entry) { return entry->next; } static inline int list_is_empty(list_t *head) { if (!head->next || head->next == head) return 1; return 0; } #ifndef offsetof #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) #endif #define list_entry(ptr, type, member) ({ \ const list_t * __mptr = (const list_t *)(ptr); \ (type *)((char *)__mptr - offsetof(type, member)); }) #define list_next_entry(ptr, type, member) \ list_entry((ptr)->next, type, member) #define list_first_entry(head, type, member) \ list_next_entry(head, type, member) #define list_for_each_entry(pos, head, type, member) \ for (pos = list_first_entry(head, type, member); \ &pos->member != (head); \ pos = list_next_entry(&pos->member, type, member)) #endif /* __LIST__H__ */