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