-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathgqueue.c
35 lines (31 loc) · 912 Bytes
/
gqueue.c
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
35
#include <gqueue.h>
void queue_enqueue(volatile void *q, const void *elt)
{
volatile struct generic_queue *gq = q;
if (gq->len == 0) {
gq->head = gq->memory;
gq->tail = gq->memory;
} else {
if (gq->tail == gq->memory + (gq->max_capacity - 1) * gq->item_size)
/* FIXME: Should something be done about
* queue length? Substact one, maybe?*/
gq->tail = gq->memory;
else
gq->tail = (uint8_t *)gq->tail + gq->item_size;
}
memcpy((void*)gq->tail, elt, gq->item_size);
gq->len++;
}
void queue_dequeue(volatile void *q, void *elt)
{
volatile struct generic_queue *gq = q;
memcpy(elt, (void*)gq->head, gq->item_size);
if (gq->head == gq->memory + (gq->max_capacity - 1) * gq->item_size)
/* FIXME: Should something be done about
* queue length? Substact one, maybe?*/
gq->head = gq->memory;
else
if (gq->len > 1)
gq->head = (uint8_t *)gq->head + gq->item_size;
gq->len--;
}