]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/kern/mpqueue.h
xnu-4903.270.47.tar.gz
[apple/xnu.git] / osfmk / kern / mpqueue.h
diff --git a/osfmk/kern/mpqueue.h b/osfmk/kern/mpqueue.h
new file mode 100644 (file)
index 0000000..0c966c6
--- /dev/null
@@ -0,0 +1,75 @@
+#ifndef _KERN_MPQUEUE_H
+#define _KERN_MPQUEUE_H
+#include <kern/locks.h>
+
+__BEGIN_DECLS
+
+#ifdef  MACH_KERNEL_PRIVATE
+
+/*----------------------------------------------------------------*/
+/*
+ *     Define macros for queues with locks.
+ */
+struct mpqueue_head {
+       struct queue_entry      head;           /* header for queue */
+       uint64_t                earliest_soft_deadline;
+       uint64_t                count;
+       lck_mtx_t               lock_data;
+#if defined(__i386__) || defined(__x86_64__)
+       lck_mtx_ext_t           lock_data_ext;
+#endif
+};
+
+typedef struct mpqueue_head     mpqueue_head_t;
+
+#define round_mpq(size)         (size)
+
+
+#if defined(__i386__) || defined(__x86_64__)
+
+#define mpqueue_init(q, lck_grp, lck_attr)              \
+MACRO_BEGIN                                             \
+       queue_init(&(q)->head);                         \
+       lck_mtx_init_ext(&(q)->lock_data,               \
+                        &(q)->lock_data_ext,           \
+                        lck_grp,                       \
+                        lck_attr);                     \
+       (q)->earliest_soft_deadline = UINT64_MAX;       \
+       (q)->count = 0;                                 \
+MACRO_END
+
+#else
+
+#define mpqueue_init(q, lck_grp, lck_attr)              \
+MACRO_BEGIN                                             \
+       queue_init(&(q)->head);                         \
+       lck_mtx_init(&(q)->lock_data,                   \
+                     lck_grp,                          \
+                     lck_attr);                        \
+MACRO_END
+#endif
+
+
+#define mpenqueue_tail(q, elt)                          \
+MACRO_BEGIN                                             \
+       lck_mtx_lock_spin_always(&(q)->lock_data);      \
+       enqueue_tail(&(q)->head, elt);                  \
+       lck_mtx_unlock_always(&(q)->lock_data);         \
+MACRO_END
+
+#define mpdequeue_head(q, elt)                          \
+MACRO_BEGIN                                             \
+       lck_mtx_lock_spin_always(&(q)->lock_data);      \
+       if (queue_empty(&(q)->head))                    \
+               *(elt) = 0;                             \
+       else                                            \
+               *(elt) = dequeue_head(&(q)->head);      \
+       lck_mtx_unlock_always(&(q)->lock_data);         \
+MACRO_END
+
+#endif  /* MACH_KERNEL_PRIVATE */
+
+__END_DECLS
+
+
+#endif /* _KERN_QUEUE_H */