From 0d6761054172ab3456faa3319a651cfe625dcda1 Mon Sep 17 00:00:00 2001 From: Kevin Bracey Date: Wed, 3 Apr 2019 18:17:03 +0300 Subject: [PATCH] equeue: align passed-in buffer Make equeue_create_inplace align the passed-in buffer and size to sizeof(void *). Really we should be aiming to align more for ARM, as blocks should be 8-byte aligned, but the internal heap mechanisms only work to 4-byte alignment at the moment. More work would be needed to ensure 8-byte alignment of allocated blocks. --- equeue.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/equeue.c b/equeue.c index b05b6fd..612ba57 100644 --- a/equeue.c +++ b/equeue.c @@ -7,9 +7,9 @@ #include "equeue.h" #include +#include #include - // calculate the relative-difference between absolute times while // correctly handling overflow conditions static inline int equeue_tickdiff(unsigned a, unsigned b) { @@ -47,7 +47,11 @@ int equeue_create(equeue_t *q, size_t size) { int equeue_create_inplace(equeue_t *q, size_t size, void *buffer) { // setup queue around provided buffer - q->buffer = buffer; + // ensure buffer and size are aligned + q->buffer = (void *)(((uintptr_t) buffer + sizeof(void *) -1) & ~(sizeof(void *) -1)); + size -= (char *) q->buffer - (char *) buffer; + size &= ~(sizeof(void *) -1); + q->allocated = 0; q->npw2 = 0; @@ -57,7 +61,7 @@ int equeue_create_inplace(equeue_t *q, size_t size, void *buffer) { q->chunks = 0; q->slab.size = size; - q->slab.data = buffer; + q->slab.data = q->buffer; q->queue = 0; q->tick = equeue_tick();