Previously we used pg_atomic_write_64_impl inside
pg_atomic_init_u64. That works correctly, but on platforms without
64bit single copy atomicity it could trigger spurious valgrind errors
about uninitialized memory, because we use compare_and_swap for atomic
writes on such platforms.
I previously suppressed one instance of this problem (
6c878edc1df),
but as Tom reports that wasn't enough. As the atomic variable cannot
yet be concurrently accessible during initialization, it seems better
to have pg_atomic_init_64_impl set the value directly.
Change pg_atomic_init_u32_impl for symmetry.
Reported-By: Tom Lane
Author: Andres Freund
Discussion: https://postgr.es/m/
1714601.
1591503815@sss.pgh.pa.us
Backpatch: 9.5-
static inline void
pg_atomic_init_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val_)
{
- pg_atomic_write_u32_impl(ptr, val_);
+ ptr->value = val_;
}
#endif
static inline void
pg_atomic_init_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val_)
{
- pg_atomic_write_u64_impl(ptr, val_);
+ ptr->value = val_;
}
#endif
fun:IsBinaryCoercible
}
-# Atomic writes to 64bit atomic vars uses compare/exchange to
-# guarantee atomic writes of 64bit variables. pg_atomic_write is used
-# during initialization of the atomic variable; that leads to an
-# initial read of the old, undefined, memory value. But that's just to
-# make sure the swap works correctly.
-{
- uninitialized_atomic_init_u64
- Memcheck:Cond
- fun:pg_atomic_exchange_u64_impl
- fun:pg_atomic_write_u64_impl
- fun:pg_atomic_init_u64_impl
-}
-
-
# Python's allocator does some low-level tricks for efficiency. Those
# can be disabled for better instrumentation; but few people testing
# postgres will have such a build of python. So add broad