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