mirror of
https://github.com/postgres/postgres.git
synced 2025-06-01 14:21:49 +03:00
Remove bogus assertion in pg_atomic_monotonic_advance_u64
This code wanted to ensure that the 'exchange' variable passed to pg_atomic_compare_exchange_u64 has correct alignment, but apparently platforms don't actually require anything that doesn't come naturally. While messing with pg_atomic_monotonic_advance_u64: instead of using Max() to determine the value to return, just use pg_atomic_compare_exchange_u64()'s return value to decide; also, use pg_atomic_compare_exchange_u64 instead of the _impl version; also remove the unnecessary underscore at the end of variable name "target". Backpatch to 17, where this code was introduced by commit bf3ff7bf83bc. Reported-by: Alexander Lakhin <exclusion@gmail.com> Discussion: https://postgr.es/m/36796438-a718-cf9b-2071-b2c1b947c1b5@gmail.com
This commit is contained in:
parent
1c9acb14ae
commit
3a9d0d774d
@ -509,7 +509,6 @@ pg_atomic_compare_exchange_u64(volatile pg_atomic_uint64 *ptr,
|
|||||||
{
|
{
|
||||||
#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
|
#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
|
||||||
AssertPointerAlignment(ptr, 8);
|
AssertPointerAlignment(ptr, 8);
|
||||||
AssertPointerAlignment(expected, 8);
|
|
||||||
#endif
|
#endif
|
||||||
return pg_atomic_compare_exchange_u64_impl(ptr, expected, newval);
|
return pg_atomic_compare_exchange_u64_impl(ptr, expected, newval);
|
||||||
}
|
}
|
||||||
@ -578,7 +577,7 @@ pg_atomic_sub_fetch_u64(volatile pg_atomic_uint64 *ptr, int64 sub_)
|
|||||||
* Full barrier semantics (even when value is unchanged).
|
* Full barrier semantics (even when value is unchanged).
|
||||||
*/
|
*/
|
||||||
static inline uint64
|
static inline uint64
|
||||||
pg_atomic_monotonic_advance_u64(volatile pg_atomic_uint64 *ptr, uint64 target_)
|
pg_atomic_monotonic_advance_u64(volatile pg_atomic_uint64 *ptr, uint64 target)
|
||||||
{
|
{
|
||||||
uint64 currval;
|
uint64 currval;
|
||||||
|
|
||||||
@ -587,23 +586,19 @@ pg_atomic_monotonic_advance_u64(volatile pg_atomic_uint64 *ptr, uint64 target_)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
currval = pg_atomic_read_u64_impl(ptr);
|
currval = pg_atomic_read_u64_impl(ptr);
|
||||||
if (currval >= target_)
|
if (currval >= target)
|
||||||
{
|
{
|
||||||
pg_memory_barrier();
|
pg_memory_barrier();
|
||||||
return currval;
|
return currval;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef PG_HAVE_ATOMIC_U64_SIMULATION
|
while (currval < target)
|
||||||
AssertPointerAlignment(&currval, 8);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
while (currval < target_)
|
|
||||||
{
|
{
|
||||||
if (pg_atomic_compare_exchange_u64_impl(ptr, &currval, target_))
|
if (pg_atomic_compare_exchange_u64(ptr, &currval, target))
|
||||||
break;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Max(target_, currval);
|
return currval;
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef INSIDE_ATOMICS_H
|
#undef INSIDE_ATOMICS_H
|
||||||
|
@ -173,6 +173,8 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
|
|||||||
uint32 condition_register;
|
uint32 condition_register;
|
||||||
bool ret;
|
bool ret;
|
||||||
|
|
||||||
|
AssertPointerAlignment(expected, 8);
|
||||||
|
|
||||||
/* Like u32, but s/lwarx/ldarx/; s/stwcx/stdcx/; s/cmpw/cmpd/ */
|
/* Like u32, but s/lwarx/ldarx/; s/stwcx/stdcx/; s/cmpw/cmpd/ */
|
||||||
#ifdef HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P
|
#ifdef HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P
|
||||||
if (__builtin_constant_p(*expected) &&
|
if (__builtin_constant_p(*expected) &&
|
||||||
|
@ -207,6 +207,8 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
|
|||||||
{
|
{
|
||||||
char ret;
|
char ret;
|
||||||
|
|
||||||
|
AssertPointerAlignment(expected, 8);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Perform cmpxchg and use the zero flag which it implicitly sets when
|
* Perform cmpxchg and use the zero flag which it implicitly sets when
|
||||||
* equal to measure the success.
|
* equal to measure the success.
|
||||||
|
@ -240,6 +240,7 @@ static inline bool
|
|||||||
pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
|
pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
|
||||||
uint64 *expected, uint64 newval)
|
uint64 *expected, uint64 newval)
|
||||||
{
|
{
|
||||||
|
AssertPointerAlignment(expected, 8);
|
||||||
return __atomic_compare_exchange_n(&ptr->value, expected, newval, false,
|
return __atomic_compare_exchange_n(&ptr->value, expected, newval, false,
|
||||||
__ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
|
__ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
|
||||||
}
|
}
|
||||||
@ -253,6 +254,8 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
|
|||||||
{
|
{
|
||||||
bool ret;
|
bool ret;
|
||||||
uint64 current;
|
uint64 current;
|
||||||
|
|
||||||
|
AssertPointerAlignment(expected, 8);
|
||||||
current = __sync_val_compare_and_swap(&ptr->value, *expected, newval);
|
current = __sync_val_compare_and_swap(&ptr->value, *expected, newval);
|
||||||
ret = current == *expected;
|
ret = current == *expected;
|
||||||
*expected = current;
|
*expected = current;
|
||||||
|
@ -102,6 +102,7 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,
|
|||||||
bool ret;
|
bool ret;
|
||||||
uint64 current;
|
uint64 current;
|
||||||
|
|
||||||
|
AssertPointerAlignment(expected, 8);
|
||||||
current = atomic_cas_64(&ptr->value, *expected, newval);
|
current = atomic_cas_64(&ptr->value, *expected, newval);
|
||||||
ret = current == *expected;
|
ret = current == *expected;
|
||||||
*expected = current;
|
*expected = current;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user