diff --git a/programs/benchfn.c b/programs/benchfn.c index a27d91a0..318f4d63 100644 --- a/programs/benchfn.c +++ b/programs/benchfn.c @@ -180,9 +180,12 @@ void BMK_freeTimedFnState(BMK_timedFnState_t* state) { BMK_timedFnState_t* BMK_initStatic_timedFnState(void* buffer, size_t size, unsigned total_ms, unsigned run_ms) { + enum { timedFnState_staticSize_isLargeEnough=(1/(sizeof(BMK_timedFnState_shell) >= sizeof(struct BMK_timedFnState_s))) }; /* static assert */ + typedef struct { char c; long long ll; } ll_align; /* this will force ll to be aligned at its next best position */ + size_t const ll_alignment = offsetof(ll_align, ll); /* provides the minimal alignment restriction for long long */ BMK_timedFnState_t* const r = (BMK_timedFnState_t*)buffer; if (size < sizeof(struct BMK_timedFnState_s)) return NULL; - if ((size_t)buffer % 8) return NULL; /* must be aligned on 8-bytes boundaries */ + if ((size_t)buffer % ll_alignment) return NULL; /* must be aligned to satisfy `long long` alignment requirement */ BMK_resetTimedFnState(r, total_ms, run_ms); return r; } diff --git a/programs/benchfn.h b/programs/benchfn.h index 737dfa99..19e05658 100644 --- a/programs/benchfn.h +++ b/programs/benchfn.h @@ -168,7 +168,7 @@ void BMK_freeTimedFnState(BMK_timedFnState_t* state); * It will check if provided buffer is large enough and is correctly aligned, * and will return NULL if conditions are not respected. */ -#define BMK_TIMEDFNSTATE_SIZE 56 +#define BMK_TIMEDFNSTATE_SIZE 64 typedef union { char never_access_space[BMK_TIMEDFNSTATE_SIZE]; long long alignment_enforcer; /* must be aligned on 8-bytes boundaries */