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