]> git.saurik.com Git - apple/xnu.git/blob - osfmk/kern/mpqueue.h
xnu-6153.61.1.tar.gz
[apple/xnu.git] / osfmk / kern / mpqueue.h
1 #ifndef _KERN_MPQUEUE_H
2 #define _KERN_MPQUEUE_H
3 #include <kern/locks.h>
4
5 __BEGIN_DECLS
6
7 #ifdef MACH_KERNEL_PRIVATE
8
9 /*----------------------------------------------------------------*/
10 /*
11 * Define macros for queues with locks.
12 */
13 struct mpqueue_head {
14 struct queue_entry head; /* header for queue */
15 uint64_t earliest_soft_deadline;
16 uint64_t count;
17 lck_mtx_t lock_data;
18 #if defined(__i386__) || defined(__x86_64__)
19 lck_mtx_ext_t lock_data_ext;
20 #endif
21 };
22
23 typedef struct mpqueue_head mpqueue_head_t;
24
25 #define round_mpq(size) (size)
26
27
28 #if defined(__i386__) || defined(__x86_64__)
29
30 #define mpqueue_init(q, lck_grp, lck_attr) \
31 MACRO_BEGIN \
32 queue_init(&(q)->head); \
33 lck_mtx_init_ext(&(q)->lock_data, \
34 &(q)->lock_data_ext, \
35 lck_grp, \
36 lck_attr); \
37 (q)->earliest_soft_deadline = UINT64_MAX; \
38 (q)->count = 0; \
39 MACRO_END
40
41 #else
42
43 #define mpqueue_init(q, lck_grp, lck_attr) \
44 MACRO_BEGIN \
45 queue_init(&(q)->head); \
46 lck_mtx_init(&(q)->lock_data, \
47 lck_grp, \
48 lck_attr); \
49 MACRO_END
50 #endif
51
52
53 #define mpenqueue_tail(q, elt) \
54 MACRO_BEGIN \
55 lck_mtx_lock_spin_always(&(q)->lock_data); \
56 enqueue_tail(&(q)->head, elt); \
57 lck_mtx_unlock_always(&(q)->lock_data); \
58 MACRO_END
59
60 #define mpdequeue_head(q, elt) \
61 MACRO_BEGIN \
62 lck_mtx_lock_spin_always(&(q)->lock_data); \
63 if (queue_empty(&(q)->head)) \
64 *(elt) = 0; \
65 else \
66 *(elt) = dequeue_head(&(q)->head); \
67 lck_mtx_unlock_always(&(q)->lock_data); \
68 MACRO_END
69
70 #endif /* MACH_KERNEL_PRIVATE */
71
72 __END_DECLS
73
74
75 #endif /* _KERN_QUEUE_H */