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