+/*
+ * Iterate over a list, safe against removal of list entry
+ */
+#define List_For_Each_Safe(pos, n, head) \
+ for (pos = (head)->next, n = pos->next; pos != (head); \
+ pos = n, n = pos->next)
+/*
+ * Iterate over a list backwards, safe against removal of list entry
+ */
+#define List_For_Each_Prev_Safe(pos, n, head) \
+ for (pos = (head)->prev, n = pos->prev; \
+ pos != (head); \
+ pos = n, n = pos->prev)
+/*
+ * Test if the entry points to the head of the list
+ */
+#define List_Entry_Is_Head(pos, head, member) \
+ (&pos->member == (head))
+
+/*
+ * Iterate over a list of a given type
+ */
+#define List_For_Each_Entry(pos, head, member) \
+ for (pos = List_Last_Entry(head, Q_typeof(*pos), member); \
+ !List_Entry_Is_Head(pos, head, member); \
+ pos = List_Prev_Entry(pos, member))
+
+/*
+ * Iterate over a list of a given type backwards
+ */
+#define List_For_Each_Prev_Entry(pos, head, member) \
+ for (pos = List_Last_Entry(head, Q_typeof(*pos), member); \
+ !List_Entry_Is_Head(pos, head, member); \
+ pos = List_Prev_Entry(pos, member))
+
+/*
+ * Prepares a pos entry for use as a start point in List_For_Each_Entry_Continue()
+ */
+#define List_Prepare_Entry(pos, head, member) \
+ ((pos) ? : List_Entry(head, Q_typeof(*pos), member))
+
+/*
+ * Continue iteration over a list of a given type, after the current position
+ */
+#define List_For_Each_Entry_Continue(pos, head, member) \
+ for (pos = List_Next_Entry(pos, member); \
+ !List_Entry_Is_Head(pos, head, member); \
+ pos = List_Next_Entry(pos, member))
+
+/*
+ * Continue iteration over a list of a given type backwards, after the current position
+ */
+#define List_For_Each_Prev_Entry_Continue(pos, head, member) \
+ for (pos = List_Prev_Entry(pos, member); \
+ !List_Entry_Is_Head(pos, head, member); \
+ pos = List_Prev_Entry(pos, member))
+
+/*
+ * Continue iteration over a list of a given type, from the current position
+ */
+#define List_For_Each_Entry_From(pos, head, member) \
+ for (; !List_Entry_Is_Head(pos, head, member); \
+ pos = List_Next_Entry(pos, member))
+
+/*
+ * Continue iteration over a list of a given type backwards, from the current position
+ */
+#define List_For_Each_Prev_Entry_From(pos, head, member) \
+ for (; !List_Entry_Is_Head(pos, head, member); \
+ pos = List_Prev_Entry(pos, member))
+
+/*
+ * Iterate over a list of a given type, safe against removal of list entry
+ */
+#define List_For_Each_Entry_Safe(pos, n, head, member) \
+ for (pos = List_First_Entry(head, Q_typeof(*pos), member), \
+ n = List_Next_Entry(pos, member); \
+ !List_Entry_Is_Head(pos, head, member); \
+ pos = n, n = List_Next_Entry(n, member))
+/*
+ * Continue iteration over a list of a given type, after the current position, safe against removal of list entry
+ */
+#define List_For_Each_Entry_Safe_Continue(pos, n, head, member) \
+ for (pos = List_Next_Entry(pos, member), \
+ n = List_Next_Entry(pos, member); \
+ !List_Entry_Is_Head(pos, head, member); \
+ pos = n, n = List_Next_Entry(n, member))
+
+/*
+ * Continue iteration over a list of a given type, from the current position, safe against removal of list entry
+ */
+#define List_For_Each_Entry_Safe_From(pos, n, head, member) \
+ for (n = List_Next_Entry(pos, member); \
+ !List_Entry_Is_Head(pos, head, member); \
+ pos = n, n = List_Next_Entry(n, member))
+
+
+/*
+ * Iterate over a list of a given type backwards, safe against removal of list entry
+ */
+#define List_For_Each_Prev_Entry_Safe(pos, n, head, member) \
+ for (pos = List_Last_Entry(head, Q_typeof(*pos), member), \
+ n = List_Prev_Entry(pos, member); \
+ !List_Entry_Is_Head(pos, head, member); \
+ pos = n, n = List_Prev_Entry(n, member))
+
+/*
+ * Reset a stale List_For_Each_Entry_Safe loop
+ */
+#define List_Safe_Reset_Next(pos, n, member) \
+ n = List_Next_Entry(pos, member)
+
+void List_Create(llist_t *list);