x86_64 and ARM64 do support the double-word atomic CAS. However on
ARM it must be done only on aligned data. The random generator makes
use of such double-word atomic CAS when available but didn't enforce
alignment, which causes ARM64 to crash early in the startup since
commit
52bf839 ("BUG/MEDIUM: random: implement a thread-safe and
process-safe PRNG").
This commit just unconditionally aligns the arrays. It must be
backported to all branches where the commit above is backported
(likely till 2.0).
/* Random number generator state, see below */
-static uint64_t ha_random_state[2];
+static uint64_t ha_random_state[2] ALIGNED(2*sizeof(uint64_t));
/* This is a thread-safe implementation of xoroshiro128** described below:
* http://prng.di.unimi.it/
uint64_t ha_random64()
{
uint64_t result;
- uint64_t old[2];
- uint64_t new[2];
+ uint64_t old[2] ALIGNED(2*sizeof(uint64_t));
+ uint64_t new[2] ALIGNED(2*sizeof(uint64_t));
#if defined(USE_THREAD) && (!defined(HA_CAS_IS_8B) || !defined(HA_HAVE_CAS_DW))
static HA_SPINLOCK_T rand_lock;