xref: /xnu-12377.41.6/osfmk/kern/mpqueue.h (revision bbb1b6f9e71b8cdde6e5cd6f4841f207dee3d828)
1*bbb1b6f9SApple OSS Distributions #ifndef _KERN_MPQUEUE_H
2*bbb1b6f9SApple OSS Distributions #define _KERN_MPQUEUE_H
3*bbb1b6f9SApple OSS Distributions #include <kern/locks.h>
4*bbb1b6f9SApple OSS Distributions 
5*bbb1b6f9SApple OSS Distributions __BEGIN_DECLS
6*bbb1b6f9SApple OSS Distributions 
7*bbb1b6f9SApple OSS Distributions #ifdef  MACH_KERNEL_PRIVATE
8*bbb1b6f9SApple OSS Distributions 
9*bbb1b6f9SApple OSS Distributions #include <kern/priority_queue.h>
10*bbb1b6f9SApple OSS Distributions 
11*bbb1b6f9SApple OSS Distributions /*----------------------------------------------------------------*/
12*bbb1b6f9SApple OSS Distributions /*
13*bbb1b6f9SApple OSS Distributions  *	Define macros for queues with locks.
14*bbb1b6f9SApple OSS Distributions  */
15*bbb1b6f9SApple OSS Distributions struct mpqueue_head {
16*bbb1b6f9SApple OSS Distributions 	struct queue_entry      head;           /* header for queue */
17*bbb1b6f9SApple OSS Distributions 	struct priority_queue_deadline_min mpq_pqhead;
18*bbb1b6f9SApple OSS Distributions 	uint64_t                earliest_soft_deadline;
19*bbb1b6f9SApple OSS Distributions 	uint64_t                count;
20*bbb1b6f9SApple OSS Distributions 	lck_ticket_t            lock_data;
21*bbb1b6f9SApple OSS Distributions };
22*bbb1b6f9SApple OSS Distributions 
23*bbb1b6f9SApple OSS Distributions typedef struct mpqueue_head     mpqueue_head_t;
24*bbb1b6f9SApple OSS Distributions 
25*bbb1b6f9SApple OSS Distributions #define mpqueue_init(q, lck_grp, lck_attr)              \
26*bbb1b6f9SApple OSS Distributions MACRO_BEGIN                                             \
27*bbb1b6f9SApple OSS Distributions 	queue_init(&(q)->head);                         \
28*bbb1b6f9SApple OSS Distributions 	lck_ticket_init(&(q)->lock_data, lck_grp);      \
29*bbb1b6f9SApple OSS Distributions 	priority_queue_init(&(q)->mpq_pqhead);          \
30*bbb1b6f9SApple OSS Distributions MACRO_END
31*bbb1b6f9SApple OSS Distributions 
32*bbb1b6f9SApple OSS Distributions #define mpenqueue_tail(q, elt)                          \
33*bbb1b6f9SApple OSS Distributions MACRO_BEGIN                                             \
34*bbb1b6f9SApple OSS Distributions 	lck_ticket_lock(&(q)->lock_data, LCK_GRP_NULL); \
35*bbb1b6f9SApple OSS Distributions 	enqueue_tail(&(q)->head, elt);                  \
36*bbb1b6f9SApple OSS Distributions 	lck_ticket_unlock(&(q)->lock_data);             \
37*bbb1b6f9SApple OSS Distributions MACRO_END
38*bbb1b6f9SApple OSS Distributions 
39*bbb1b6f9SApple OSS Distributions #define mpdequeue_head(q, elt)                          \
40*bbb1b6f9SApple OSS Distributions MACRO_BEGIN                                             \
41*bbb1b6f9SApple OSS Distributions 	lck_ticket_lock(&(q)->lock_data, LCK_GRP_NULL); \
42*bbb1b6f9SApple OSS Distributions 	if (queue_empty(&(q)->head))                    \
43*bbb1b6f9SApple OSS Distributions 	        *(elt) = 0;                             \
44*bbb1b6f9SApple OSS Distributions 	else                                            \
45*bbb1b6f9SApple OSS Distributions 	        *(elt) = dequeue_head(&(q)->head);      \
46*bbb1b6f9SApple OSS Distributions 	lck_ticket_unlock(&(q)->lock_data);             \
47*bbb1b6f9SApple OSS Distributions MACRO_END
48*bbb1b6f9SApple OSS Distributions 
49*bbb1b6f9SApple OSS Distributions #endif  /* MACH_KERNEL_PRIVATE */
50*bbb1b6f9SApple OSS Distributions 
51*bbb1b6f9SApple OSS Distributions __END_DECLS
52*bbb1b6f9SApple OSS Distributions 
53*bbb1b6f9SApple OSS Distributions 
54*bbb1b6f9SApple OSS Distributions #endif /* _KERN_QUEUE_H */
55