From abf5190c07a7e4de2b10b01dc38723aaa28339f6 Mon Sep 17 00:00:00 2001 From: Noah Misch Date: Wed, 8 Jul 2015 20:44:21 -0400 Subject: [PATCH] Finish generic-xlc.h draft atomics implementation. Back-patch to 9.5, where commit b64d92f1a5602c55ee8b27a7ac474f03b7aee340 introduced this file. --- src/include/port/atomics/generic-xlc.h | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/src/include/port/atomics/generic-xlc.h b/src/include/port/atomics/generic-xlc.h index 1c743f2bc8..0ad9168ed2 100644 --- a/src/include/port/atomics/generic-xlc.h +++ b/src/include/port/atomics/generic-xlc.h @@ -18,8 +18,6 @@ #if defined(HAVE_ATOMICS) -#include - #define PG_HAVE_ATOMIC_U32_SUPPORT typedef struct pg_atomic_uint32 { @@ -48,9 +46,6 @@ static inline bool pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 *expected, uint32 newval) { - bool ret; - uint64 current; - /* * xlc's documentation tells us: * "If __compare_and_swap is used as a locking primitive, insert a call to @@ -62,18 +57,15 @@ pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, * XXX: __compare_and_swap is defined to take signed parameters, but that * shouldn't matter since we don't perform any arithmetic operations. */ - current = (uint32)__compare_and_swap((volatile int*)ptr->value, - (int)*expected, (int)newval); - ret = current == *expected; - *expected = current; - return ret; + return __compare_and_swap((volatile int*)&ptr->value, + (int *)expected, (int)newval); } #define PG_HAVE_ATOMIC_FETCH_ADD_U32 static inline uint32 pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_) { - return __fetch_and_add(&ptr->value, add_); + return __fetch_and_add((volatile int *)&ptr->value, add_); } #ifdef PG_HAVE_ATOMIC_U64_SUPPORT @@ -83,23 +75,17 @@ static inline bool pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 *expected, uint64 newval) { - bool ret; - uint64 current; - __isync(); - current = (uint64)__compare_and_swaplp((volatile long*)ptr->value, - (long)*expected, (long)newval); - ret = current == *expected; - *expected = current; - return ret; + return __compare_and_swaplp((volatile long*)&ptr->value, + (long *)expected, (long)newval);; } #define PG_HAVE_ATOMIC_FETCH_ADD_U64 static inline uint64 pg_atomic_fetch_add_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_) { - return __fetch_and_addlp(&ptr->value, add_); + return __fetch_and_addlp((volatile long *)&ptr->value, add_); } #endif /* PG_HAVE_ATOMIC_U64_SUPPORT */