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