blob: d569df04573c9bff6877970bfac57321fc2cfa8c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#include "kpl.h"
extern inline void kpl_object_queue_init(kpl_object_queue *object_queue);
extern inline void kpl_object_queue_enqueue(kpl_object_queue *object_queue, void *object);
void *kpl_object_queue_dequeue(kpl_object_queue *object_queue) {
kpl_object *object = NULL;
for (;;) {
kpl_object *tail = object_queue->tail, *queue_next = __atomic_load_n(&tail->queue_next, __ATOMIC_ACQUIRE);
if (tail == (kpl_object*) &object_queue->dummy) {
if (!queue_next)
break;
tail = object_queue->tail = queue_next;
queue_next = __atomic_load_n(&tail->queue_next, __ATOMIC_ACQUIRE);
}
if (!queue_next) {
kpl_object *head = __atomic_load_n(&object_queue->head, __ATOMIC_ACQUIRE);
if (head != tail)
continue;
kpl_object_queue_enqueue(object_queue, (kpl_object*) &object_queue->dummy);
queue_next = __atomic_load_n(&tail->queue_next, __ATOMIC_ACQUIRE);
}
if (queue_next) {
object_queue->tail = queue_next;
object = tail;
break;
}
}
if (object)
__atomic_store_n(&object->queue_next, NULL, __ATOMIC_RELAXED);
return object;
}
|