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