]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/kern/queue.h
xnu-7195.101.1.tar.gz
[apple/xnu.git] / osfmk / kern / queue.h
index 6af62629fddcab41e67364c78915b880e364641a..ac758f79e809bdd6cd77d5b7f1927ced8b1ac041 100644 (file)
@@ -71,6 +71,7 @@
 #include <kern/macro_help.h>
 
 #include <sys/cdefs.h>
+#include <string.h>
 
 __BEGIN_DECLS
 
@@ -231,14 +232,14 @@ __QUEUE_ELT_VALIDATE(queue_entry_t elt)
 {
        queue_entry_t   elt_next, elt_prev;
 
-       if (__improbable(elt == (queue_entry_t)0)) {
+       if (__improbable(elt == (queue_entry_t)NULL)) {
                panic("Invalid queue element %p", elt);
        }
 
        elt_next = elt->next;
        elt_prev = elt->prev;
 
-       if (__improbable(elt_next == (queue_entry_t)0 || elt_prev == (queue_entry_t)0)) {
+       if (__improbable(elt_next == (queue_entry_t)NULL || elt_prev == (queue_entry_t)NULL)) {
                panic("Invalid queue element pointers for %p: next %p prev %p", elt, elt_next, elt_prev);
        }
        if (__improbable(elt_next->prev != elt || elt_prev->next != elt)) {
@@ -250,8 +251,8 @@ __QUEUE_ELT_VALIDATE(queue_entry_t elt)
 static inline void
 __DEQUEUE_ELT_CLEANUP(queue_entry_t elt)
 {
-       (elt)->next = (queue_entry_t) 0;
-       (elt)->prev = (queue_entry_t) 0;
+       (elt)->next = (queue_entry_t)NULL;
+       (elt)->prev = (queue_entry_t)NULL;
 }
 #else
 #define __QUEUE_ELT_VALIDATE(elt) do { } while (0)
@@ -292,7 +293,7 @@ static __inline__ queue_entry_t
 dequeue_head(
        queue_t que)
 {
-       queue_entry_t   elt = (queue_entry_t) 0;
+       queue_entry_t   elt = (queue_entry_t)NULL;
        queue_entry_t   new_head;
 
        if (que->next != que) {
@@ -311,7 +312,7 @@ static __inline__ queue_entry_t
 dequeue_tail(
        queue_t que)
 {
-       queue_entry_t   elt = (queue_entry_t) 0;
+       queue_entry_t   elt = (queue_entry_t)NULL;
        queue_entry_t   new_tail;
 
        if (que->prev != que) {
@@ -359,14 +360,7 @@ static __inline__ void
 remque(
        queue_entry_t elt)
 {
-       queue_entry_t   next_elt, prev_elt;
-
-       __QUEUE_ELT_VALIDATE(elt);
-       next_elt = elt->next;
-       prev_elt = elt->prev; /* next_elt may equal prev_elt (and the queue head) if elt was the only element */
-       next_elt->prev = prev_elt;
-       prev_elt->next = next_elt;
-       __DEQUEUE_ELT_CLEANUP(elt);
+       remqueue(elt);
 }
 
 /*
@@ -449,8 +443,7 @@ re_queue_tail(queue_t que, queue_entry_t elt)
  *     Note:
  *             Do not use pointer types for <type>
  */
-#define qe_element(qe, type, field) \
-       ((type *)((void *)((char *)(qe) - __offsetof(type, field))))
+#define qe_element(qe, type, field) __container_of(qe, type, field)
 
 /*
  *     Macro:          qe_foreach
@@ -572,8 +565,34 @@ re_queue_tail(queue_t que, queue_entry_t elt)
        _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 }
+
 /*
  *     Macro:          queue_init
  *     Function: