diff --git a/include/villas/queue.h b/include/villas/queue.h index c94f6a90f..e13b3feed 100644 --- a/include/villas/queue.h +++ b/include/villas/queue.h @@ -44,7 +44,7 @@ typedef char cacheline_pad_t[CACHELINE_SIZE]; struct queue_cell { atomic_size_t sequence; - void *data; + size_t data_off; /**< Pointer relative to the queue struct */ }; struct queue { diff --git a/lib/queue.c b/lib/queue.c index c22542829..be31649b9 100644 --- a/lib/queue.c +++ b/lib/queue.c @@ -102,7 +102,7 @@ int queue_push(struct queue *q, void *ptr) pos = atomic_load_explicit(&q->tail, memory_order_relaxed); } - cell->data = ptr; + cell->data_off = (char *) ptr - (char *) q; atomic_store_explicit(&cell->sequence, pos + 1, memory_order_release); return 1; @@ -131,7 +131,7 @@ int queue_pull(struct queue *q, void **ptr) pos = atomic_load_explicit(&q->head, memory_order_relaxed); } - *ptr = cell->data; + *ptr = (char *) q + cell->data_off; atomic_store_explicit(&cell->sequence, pos + q->buffer_mask + 1, memory_order_release); return 1;