diff options
| author | Andres Freund <andres@anarazel.de> | 2014-09-26 15:55:44 +0200 |
|---|---|---|
| committer | Andres Freund <andres@anarazel.de> | 2014-09-26 15:55:44 +0200 |
| commit | f9f07411a5b879b232ade66fece7071bd2eb5c26 (patch) | |
| tree | cf7d7a9093dc59235ca9648afd75895242f18886 /src/include/port/atomics/generic-gcc.h | |
| parent | a30199b01bd4b06bd13484baefb5f2f411ce14f4 (diff) | |
| download | postgresql-f9f07411a5b879b232ade66fece7071bd2eb5c26.tar.gz | |
Further atomic ops portability improvements and bug fixes.
* Don't play tricks for a more efficient pg_atomic_clear_flag() in the
generic gcc implementation. The old version was broken on gcc < 4.7
on !x86 platforms. Per buildfarm member chipmunk.
* Make usage of __atomic() fences depend on HAVE_GCC__ATOMIC_INT32_CAS
instead of HAVE_GCC__ATOMIC_INT64_CAS - there's platforms with 32bit
support that don't support 64bit atomics.
* Blindly fix two superflous #endif in generic-xlc.h
* Check for --disable-atomics in platforms but x86.
Diffstat (limited to 'src/include/port/atomics/generic-gcc.h')
| -rw-r--r-- | src/include/port/atomics/generic-gcc.h | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/src/include/port/atomics/generic-gcc.h b/src/include/port/atomics/generic-gcc.h index 6a2373079b..ecabef3144 100644 --- a/src/include/port/atomics/generic-gcc.h +++ b/src/include/port/atomics/generic-gcc.h @@ -40,19 +40,19 @@ * definitions where possible, and use this only as a fallback. */ #if !defined(pg_memory_barrier_impl) -# if defined(HAVE_GCC__ATOMIC_INT64_CAS) +# if defined(HAVE_GCC__ATOMIC_INT32_CAS) # define pg_memory_barrier_impl() __atomic_thread_fence(__ATOMIC_SEQ_CST) # elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) # define pg_memory_barrier_impl() __sync_synchronize() # endif #endif /* !defined(pg_memory_barrier_impl) */ -#if !defined(pg_read_barrier_impl) && defined(HAVE_GCC__ATOMIC_INT64_CAS) +#if !defined(pg_read_barrier_impl) && defined(HAVE_GCC__ATOMIC_INT32_CAS) /* acquire semantics include read barrier semantics */ # define pg_read_barrier_impl() __atomic_thread_fence(__ATOMIC_ACQUIRE) #endif -#if !defined(pg_write_barrier_impl) && defined(HAVE_GCC__ATOMIC_INT64_CAS) +#if !defined(pg_write_barrier_impl) && defined(HAVE_GCC__ATOMIC_INT32_CAS) /* release semantics include write barrier semantics */ # define pg_write_barrier_impl() __atomic_thread_fence(__ATOMIC_RELEASE) #endif @@ -139,13 +139,7 @@ pg_atomic_unlocked_test_flag_impl(volatile pg_atomic_flag *ptr) static inline void pg_atomic_clear_flag_impl(volatile pg_atomic_flag *ptr) { - /* - * XXX: It would be nicer to use __sync_lock_release here, but gcc insists - * on making that an atomic op which is far to expensive and a stronger - * guarantee than what we actually need. - */ - pg_write_barrier_impl(); - ptr->value = 0; + __sync_lock_release(&ptr->value); } #endif |
