+__private_extern__ uint32_t num_wait_queues;
+__private_extern__ struct wait_queue *wait_queues;
+/* The Jenkins "one at a time" hash.
+ * TBD: There may be some value to unrolling here,
+ * depending on the architecture.
+ */
+static inline uint32_t wq_hash(char *key)
+{
+ uint32_t hash = 0;
+ size_t i, length = sizeof(char *);
+
+ for (i = 0; i < length; i++) {
+ hash += key[i];
+ hash += (hash << 10);
+ hash ^= (hash >> 6);
+ }
+
+ hash += (hash << 3);
+ hash ^= (hash >> 11);
+ hash += (hash << 15);
+
+ hash &= (num_wait_queues - 1);
+ return hash;
+}
+
+#define wait_hash(event) wq_hash((char *)&event)
+
+#endif /* MACH_KERNEL_PRIVATE */
+
+__BEGIN_DECLS
+
+/******** Semi-Public interfaces (not a part of a higher construct) ************/
+
+extern unsigned int wait_queue_set_size(void);
+extern unsigned int wait_queue_link_size(void);
+
+extern kern_return_t wait_queue_init(
+ wait_queue_t wait_queue,
+ int policy);
+
+extern wait_queue_set_t wait_queue_set_alloc(
+ int policy);
+
+extern kern_return_t wait_queue_set_init(
+ wait_queue_set_t set_queue,
+ int policy);
+
+extern kern_return_t wait_queue_set_free(
+ wait_queue_set_t set_queue);
+
+extern wait_queue_link_t wait_queue_link_alloc(
+ int policy);
+
+extern kern_return_t wait_queue_link_free(
+ wait_queue_link_t link_element);
+
+extern kern_return_t wait_queue_link(
+ wait_queue_t wait_queue,
+ wait_queue_set_t set_queue);
+
+extern kern_return_t wait_queue_link_noalloc(
+ wait_queue_t wait_queue,
+ wait_queue_set_t set_queue,
+ wait_queue_link_t link);
+
+extern boolean_t wait_queue_member(
+ wait_queue_t wait_queue,
+ wait_queue_set_t set_queue);
+
+extern kern_return_t wait_queue_unlink(
+ wait_queue_t wait_queue,
+ wait_queue_set_t set_queue);
+
+extern kern_return_t wait_queue_unlink_all(
+ wait_queue_t wait_queue);
+
+extern kern_return_t wait_queue_set_unlink_all(
+ wait_queue_set_t set_queue);
+
+#ifdef XNU_KERNEL_PRIVATE
+extern kern_return_t wait_queue_set_unlink_one(
+ wait_queue_set_t set_queue,
+ wait_queue_link_t link);
+
+extern kern_return_t wait_queue_unlink_nofree(
+ wait_queue_t wait_queue,
+ wait_queue_set_t set_queue,
+ wait_queue_link_t *wqlp);
+
+extern kern_return_t wait_queue_unlink_all_nofree(
+ wait_queue_t wait_queue,
+ queue_t links);
+
+extern kern_return_t wait_queue_set_unlink_all_nofree(
+ wait_queue_set_t set_queue,
+ queue_t links);
+
+extern wait_queue_link_t wait_queue_link_allocate(void);
+
+#endif /* XNU_KERNEL_PRIVATE */
+
+/* legacy API */
+kern_return_t wait_queue_sub_init(
+ wait_queue_set_t set_queue,
+ int policy);
+
+kern_return_t wait_queue_sub_clearrefs(
+ wait_queue_set_t wq_set);
+
+extern kern_return_t wait_subqueue_unlink_all(
+ wait_queue_set_t set_queue);