16 #define GTG_LIST_INIT(ptr) \
18 (ptr)->prev = (ptr); \
19 (ptr)->next = (ptr); \
27 #define GTG_LIST(name) \
28 struct gtg_list name; \
39 #define gtg_list_entry(ptr, type, member) \
40 ((type *)((char *)(ptr) - (char *)(&((type *)0)->member)))
112 #define gtg_list_for_each(pos, head) \
113 for (pos = (head)->next; pos != (head); pos = pos->next)
121 #define gtg_list_for_each_reverse(pos, head) \
122 for (pos = (head)->prev; pos != (head); pos = pos->prev)
131 #define gtg_list_for_each_safe(pos, n, head) \
132 for (pos = (head)->next, n = pos->next; pos != (head); \
133 pos = n, n = pos->next)
144 #define gtg_list_for_each_entry(pos, head, member) \
145 for (pos = gtg_list_entry((head)->next, typeof(*pos), member); \
146 &pos->member != (head); \
147 pos = gtg_list_entry(pos->member.next, typeof(*pos), member))
157 #define gtg_list_for_each_entry_safe(pos, n, head, member) \
158 for (pos = gtg_list_entry((head)->next, typeof(*pos), member), \
159 n = gtg_list_entry(pos->member.next, typeof(*pos), member); \
160 &pos->member != (head); \
161 pos = n, n = gtg_list_entry(n->member.next, typeof(*n), member))
167 gtg_list_t ptr = NULL;