Problem with pg_atomic_compare_exchange_u64 at 32-bit platformwd

From: Konstantin Knizhnik <k(dot)knizhnik(at)postgrespro(dot)ru>
To: PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Problem with pg_atomic_compare_exchange_u64 at 32-bit platformwd
Date: 2020-05-19 13:07:29
Message-ID: 79caaa1f-0290-652f-d203-35d2709e7478@postgrespro.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

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).

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Justin Pryzby 2020-05-19 13:07:40 Re: Warn when parallel restoring a custom dump without data offsets
Previous Message Robert Haas 2020-05-19 12:52:07 Re: some grammar refactoring