Definition of pg_atomic_compare_exchange_u64 requires alignment of expected pointer on 8-byte boundary.

pg_atomic_compare_exchange_u64(volatile pg_atomic_uint64 *ptr,
                               uint64 *expected, uint64 newval)
{
#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
    AssertPointerAlignment(ptr, 8);
    AssertPointerAlignment(expected, 8);
#endif


I wonder if there are platforms  where such restriction is actually needed.
And if so, looks like our ./src/test/regress/regress.c is working only occasionally:

static void
test_atomic_uint64(void)
{
    pg_atomic_uint64 var;
    uint64        expected;
    ...
        if (!pg_atomic_compare_exchange_u64(&var, &expected, 1))

because there is no warranty that "expected" variable will be aligned on stack at 8 byte boundary (at least at Win32).


Reply via email to