1 #include "lsl_protos.h"
3 /* ---- data types ---- */
12 typedef struct queue {
17 /* ---- operations ---- */
19 void init_queue(queue_t *queue)
21 node_t *node = lsl_malloc_noreuse(sizeof(node_t));
23 queue->head = queue->tail = node;
26 void enqueue(queue_t *queue, value_t value)
32 node = lsl_malloc_noreuse(sizeof(node_t));
38 if (tail == queue->tail)
40 if (lsl_cas_64(&tail->next, next, node))
43 lsl_cas_ptr(&queue->tail, tail, next);
45 lsl_cas_ptr(&queue->tail, tail, node);
48 boolean_t dequeue(queue_t *queue, value_t *pvalue)
58 if (head == queue->head) {
62 lsl_cas_ptr(&queue->tail, tail, next);
64 *pvalue = next->value;
65 if (lsl_cas_ptr(&queue->head, head, next))
70 lsl_free_noreuse(head);