-#define __DEQUEUE_ELT_CLEANUP(elt) do { \
- (elt)->next = (queue_entry_t) 0; \
- (elt)->prev = (queue_entry_t) 0; \
- } while (0)
+#include <kern/debug.h>
+#include <mach/branch_predicates.h>
+static inline void __QUEUE_ELT_VALIDATE(queue_entry_t elt) {
+ queue_entry_t elt_next, elt_prev;
+
+ if (__improbable(elt == (queue_entry_t)0)) {
+ 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)) {
+ 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)) {
+ panic("Invalid queue element linkage for %p: next %p next->prev %p prev %p prev->next %p",
+ elt, elt_next, elt_next->prev, elt_prev, elt_prev->next);
+ }
+}
+
+static inline void __DEQUEUE_ELT_CLEANUP(queue_entry_t elt) {
+ (elt)->next = (queue_entry_t) 0;
+ (elt)->prev = (queue_entry_t) 0;
+}