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 | |