+/*
+ * Function: re_queue_head
+ * Parameters:
+ * queue_t que : queue onto which elt will be pre-pended
+ * queue_entry_t elt : element to re-queue
+ * Description:
+ * Remove elt from its current queue and put it onto the
+ * head of a new queue
+ * Note:
+ * This should only be used with Method 1 queue iteration (linkage chains)
+ */
+static __inline__ void
+re_queue_head(queue_t que, queue_entry_t elt)
+{
+ queue_entry_t n_elt, p_elt;
+
+ __QUEUE_ELT_VALIDATE(elt);
+ __QUEUE_ELT_VALIDATE((queue_entry_t)que);
+
+ /* remqueue */
+ n_elt = elt->next;
+ p_elt = elt->prev; /* next_elt may equal prev_elt (and the queue head) if elt was the only element */
+ n_elt->prev = p_elt;
+ p_elt->next = n_elt;
+
+ /* enqueue_head */
+ n_elt = que->next;
+ elt->next = n_elt;
+ elt->prev = que;
+ n_elt->prev = elt;
+ que->next = elt;
+}
+
+/*
+ * Function: re_queue_tail
+ * Parameters:
+ * queue_t que : queue onto which elt will be appended
+ * queue_entry_t elt : element to re-queue
+ * Description:
+ * Remove elt from its current queue and put it onto the
+ * end of a new queue
+ * Note:
+ * This should only be used with Method 1 queue iteration (linkage chains)
+ */
+static __inline__ void
+re_queue_tail(queue_t que, queue_entry_t elt)
+{
+ queue_entry_t n_elt, p_elt;
+
+ __QUEUE_ELT_VALIDATE(elt);
+ __QUEUE_ELT_VALIDATE((queue_entry_t)que);
+
+ /* remqueue */
+ n_elt = elt->next;
+ p_elt = elt->prev; /* next_elt may equal prev_elt (and the queue head) if elt was the only element */
+ n_elt->prev = p_elt;
+ p_elt->next = n_elt;
+
+ /* enqueue_tail */
+ p_elt = que->prev;
+ elt->next = que;
+ elt->prev = p_elt;
+ p_elt->next = elt;
+ que->prev = elt;
+}
+
+/*
+ * Macro: qe_element
+ * Function:
+ * Convert a queue_entry_t to a queue element pointer.
+ * Get a pointer to the user-defined element containing
+ * a given queue_entry_t
+ * Header:
+ * <type> * qe_element(queue_entry_t qe, <type>, field)
+ * qe - queue entry to convert
+ * <type> - what's in the queue (e.g., struct some_data)
+ * <field> - is the chain field in <type>
+ * Note:
+ * Do not use pointer types for <type>
+ */
+#define qe_element(qe, type, field) __container_of(qe, type, field)
+
+/*
+ * Macro: qe_foreach
+ * Function:
+ * Iterate over each queue_entry_t structure.
+ * Generates a 'for' loop, setting 'qe' to
+ * each queue_entry_t in the queue.
+ * Header:
+ * qe_foreach(queue_entry_t qe, queue_t head)
+ * qe - iteration variable
+ * head - pointer to queue_head_t (head of queue)
+ * Note:
+ * This should only be used with Method 1 queue iteration (linkage chains)
+ */
+#define qe_foreach(qe, head) \
+ for (qe = (head)->next; qe != (head); qe = (qe)->next)
+
+/*
+ * Macro: qe_foreach_safe
+ * Function:
+ * Safely iterate over each queue_entry_t structure.
+ *
+ * Use this iterator macro if you plan to remove the
+ * queue_entry_t, qe, from the queue during the
+ * iteration.
+ * Header:
+ * qe_foreach_safe(queue_entry_t qe, queue_t head)
+ * qe - iteration variable
+ * head - pointer to queue_head_t (head of queue)
+ * Note:
+ * This should only be used with Method 1 queue iteration (linkage chains)
+ */
+#define qe_foreach_safe(qe, head) \
+ for (queue_entry_t _ne = ((head)->next)->next, \
+ __ ## qe ## _unused_shadow __unused = (qe = (head)->next); \
+ qe != (head); \
+ qe = _ne, _ne = (qe)->next)
+
+/*
+ * Macro: qe_foreach_element
+ * Function:
+ * Iterate over each _element_ in a queue
+ * where each queue_entry_t points to another
+ * queue_entry_t, i.e., managed by the [de|en]queue_head/
+ * [de|en]queue_tail / remqueue / etc. function.
+ * Header:
+ * qe_foreach_element(<type> *elt, queue_t head, <field>)
+ * elt - iteration variable
+ * <type> - what's in the queue (e.g., struct some_data)
+ * <field> - is the chain field in <type>
+ * Note:
+ * This should only be used with Method 1 queue iteration (linkage chains)
+ */
+#define qe_foreach_element(elt, head, field) \
+ for (elt = qe_element((head)->next, typeof(*(elt)), field); \
+ &((elt)->field) != (head); \
+ elt = qe_element((elt)->field.next, typeof(*(elt)), field))
+
+/*
+ * Macro: qe_foreach_element_safe
+ * Function:
+ * Safely iterate over each _element_ in a queue
+ * where each queue_entry_t points to another
+ * queue_entry_t, i.e., managed by the [de|en]queue_head/
+ * [de|en]queue_tail / remqueue / etc. function.
+ *
+ * Use this iterator macro if you plan to remove the
+ * element, elt, from the queue during the iteration.
+ * Header:
+ * qe_foreach_element_safe(<type> *elt, queue_t head, <field>)
+ * elt - iteration variable
+ * <type> - what's in the queue (e.g., struct some_data)
+ * <field> - is the chain field in <type>
+ * Note:
+ * This should only be used with Method 1 queue iteration (linkage chains)
+ */
+#define qe_foreach_element_safe(elt, head, field) \
+ for (typeof(*(elt)) *_nelt = qe_element(((head)->next)->next, typeof(*(elt)), field), \
+ *__ ## elt ## _unused_shadow __unused = \
+ (elt = qe_element((head)->next, typeof(*(elt)), field)); \
+ &((elt)->field) != (head); \
+ elt = _nelt, _nelt = qe_element((elt)->field.next, typeof(*(elt)), field)) \
+
+#ifdef XNU_KERNEL_PRIVATE
+
+/* Dequeue an element from head, or return NULL if the queue is empty */
+#define qe_dequeue_head(head, type, field) ({ \
+ queue_entry_t _tmp_entry = dequeue_head((head)); \
+ type *_tmp_element = (type*) NULL; \
+ if (_tmp_entry != (queue_entry_t) NULL) \
+ _tmp_element = qe_element(_tmp_entry, type, field); \
+ _tmp_element; \
+})
+
+/* Dequeue an element from tail, or return NULL if the queue is empty */
+#define qe_dequeue_tail(head, type, field) ({ \
+ queue_entry_t _tmp_entry = dequeue_tail((head)); \
+ type *_tmp_element = (type*) NULL; \
+ if (_tmp_entry != (queue_entry_t) NULL) \
+ _tmp_element = qe_element(_tmp_entry, type, field); \
+ _tmp_element; \
+})
+
+/* Peek at the first element, or return NULL if the queue is empty */
+#define qe_queue_first(head, type, field) ({ \
+ queue_entry_t _tmp_entry = queue_first((head)); \
+ type *_tmp_element = (type*) NULL; \
+ if (_tmp_entry != (queue_entry_t) head) \
+ _tmp_element = qe_element(_tmp_entry, type, field); \
+ _tmp_element; \
+})
+
+/* Peek at the last element, or return NULL if the queue is empty */
+#define qe_queue_last(head, type, field) ({ \
+ queue_entry_t _tmp_entry = queue_last((head)); \
+ type *_tmp_element = (type*) NULL; \
+ if (_tmp_entry != (queue_entry_t) head) \
+ _tmp_element = qe_element(_tmp_entry, type, field); \
+ _tmp_element; \
+})
+
+/* Peek at the next element, or return NULL if the next element is head (indicating queue_end) */
+#define qe_queue_next(head, element, type, field) ({ \
+ queue_entry_t _tmp_entry = queue_next(&(element)->field); \
+ type *_tmp_element = (type*) NULL; \
+ if (_tmp_entry != (queue_entry_t) head) \
+ _tmp_element = qe_element(_tmp_entry, type, field); \
+ _tmp_element; \
+})
+
+/* Peek at the prev element, or return NULL if the prev element is head (indicating queue_end) */
+#define qe_queue_prev(head, element, type, field) ({ \
+ queue_entry_t _tmp_entry = queue_prev(&(element)->field); \
+ type *_tmp_element = (type*) NULL; \
+ if (_tmp_entry != (queue_entry_t) head) \
+ _tmp_element = qe_element(_tmp_entry, type, field); \
+ _tmp_element; \
+})
+
+#endif /* XNU_KERNEL_PRIVATE */
+
+/*
+ * Macro: QUEUE_HEAD_INITIALIZER()
+ * Function:
+ * Static queue head initializer
+ */
+#define QUEUE_HEAD_INITIALIZER(name) \
+ { &name, &name }