mirror of
https://github.com/facebook/zstd.git
synced 2025-08-07 06:23:00 +03:00
fixed static size of benchFnState
added a static assert to ensure condition is respected on target platform
This commit is contained in:
@@ -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)
|
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;
|
BMK_timedFnState_t* const r = (BMK_timedFnState_t*)buffer;
|
||||||
if (size < sizeof(struct BMK_timedFnState_s)) return NULL;
|
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);
|
BMK_resetTimedFnState(r, total_ms, run_ms);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
@@ -168,7 +168,7 @@ void BMK_freeTimedFnState(BMK_timedFnState_t* state);
|
|||||||
* It will check if provided buffer is large enough and is correctly aligned,
|
* It will check if provided buffer is large enough and is correctly aligned,
|
||||||
* and will return NULL if conditions are not respected.
|
* and will return NULL if conditions are not respected.
|
||||||
*/
|
*/
|
||||||
#define BMK_TIMEDFNSTATE_SIZE 56
|
#define BMK_TIMEDFNSTATE_SIZE 64
|
||||||
typedef union {
|
typedef union {
|
||||||
char never_access_space[BMK_TIMEDFNSTATE_SIZE];
|
char never_access_space[BMK_TIMEDFNSTATE_SIZE];
|
||||||
long long alignment_enforcer; /* must be aligned on 8-bytes boundaries */
|
long long alignment_enforcer; /* must be aligned on 8-bytes boundaries */
|
||||||
|
Reference in New Issue
Block a user