diff options
-rw-r--r-- | src/include/port/atomics.h | 17 | ||||
-rw-r--r-- | src/include/port/atomics/arch-ppc.h | 2 | ||||
-rw-r--r-- | src/include/port/atomics/arch-x86.h | 2 | ||||
-rw-r--r-- | src/include/port/atomics/generic-gcc.h | 3 | ||||
-rw-r--r-- | src/include/port/atomics/generic-sunpro.h | 1 |
5 files changed, 14 insertions, 11 deletions
diff --git a/src/include/port/atomics.h b/src/include/port/atomics.h index c911c6b9564..f6fa432d2df 100644 --- a/src/include/port/atomics.h +++ b/src/include/port/atomics.h @@ -507,7 +507,6 @@ pg_atomic_compare_exchange_u64(volatile pg_atomic_uint64 *ptr, { #ifndef PG_HAVE_ATOMIC_U64_SIMULATION AssertPointerAlignment(ptr, 8); - AssertPointerAlignment(expected, 8); #endif return pg_atomic_compare_exchange_u64_impl(ptr, expected, newval); } @@ -576,7 +575,7 @@ pg_atomic_sub_fetch_u64(volatile pg_atomic_uint64 *ptr, int64 sub_) * Full barrier semantics (even when value is unchanged). */ 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; @@ -585,23 +584,19 @@ pg_atomic_monotonic_advance_u64(volatile pg_atomic_uint64 *ptr, uint64 target_) #endif currval = pg_atomic_read_u64_impl(ptr); - if (currval >= target_) + if (currval >= target) { pg_memory_barrier(); return currval; } -#ifndef PG_HAVE_ATOMIC_U64_SIMULATION - AssertPointerAlignment(&currval, 8); -#endif - - while (currval < target_) + while (currval < target) { - if (pg_atomic_compare_exchange_u64_impl(ptr, &currval, target_)) - break; + if (pg_atomic_compare_exchange_u64(ptr, &currval, target)) + return target; } - return Max(target_, currval); + return currval; } #undef INSIDE_ATOMICS_H diff --git a/src/include/port/atomics/arch-ppc.h b/src/include/port/atomics/arch-ppc.h index 94ba2597fb7..edaab7c8957 100644 --- a/src/include/port/atomics/arch-ppc.h +++ b/src/include/port/atomics/arch-ppc.h @@ -173,6 +173,8 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint32 condition_register; bool ret; + AssertPointerAlignment(expected, 8); + /* Like u32, but s/lwarx/ldarx/; s/stwcx/stdcx/; s/cmpw/cmpd/ */ #ifdef HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P if (__builtin_constant_p(*expected) && diff --git a/src/include/port/atomics/arch-x86.h b/src/include/port/atomics/arch-x86.h index 3efa79dc3df..2a8eca30fcf 100644 --- a/src/include/port/atomics/arch-x86.h +++ b/src/include/port/atomics/arch-x86.h @@ -207,6 +207,8 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, { char ret; + AssertPointerAlignment(expected, 8); + /* * Perform cmpxchg and use the zero flag which it implicitly sets when * equal to measure the success. diff --git a/src/include/port/atomics/generic-gcc.h b/src/include/port/atomics/generic-gcc.h index 9d91370fa8c..872d2f02af4 100644 --- a/src/include/port/atomics/generic-gcc.h +++ b/src/include/port/atomics/generic-gcc.h @@ -240,6 +240,7 @@ static inline bool pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 *expected, uint64 newval) { + AssertPointerAlignment(expected, 8); return __atomic_compare_exchange_n(&ptr->value, expected, newval, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); } @@ -253,6 +254,8 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, { bool ret; uint64 current; + + AssertPointerAlignment(expected, 8); current = __sync_val_compare_and_swap(&ptr->value, *expected, newval); ret = current == *expected; *expected = current; diff --git a/src/include/port/atomics/generic-sunpro.h b/src/include/port/atomics/generic-sunpro.h index e060c0868a9..840a45e7788 100644 --- a/src/include/port/atomics/generic-sunpro.h +++ b/src/include/port/atomics/generic-sunpro.h @@ -102,6 +102,7 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, bool ret; uint64 current; + AssertPointerAlignment(expected, 8); current = atomic_cas_64(&ptr->value, *expected, newval); ret = current == *expected; *expected = current; |