From 84addbedee65322625a101f1cf5a97860a26b1ef Mon Sep 17 00:00:00 2001 From: David Robillard Date: Thu, 13 Aug 2020 17:25:45 +0200 Subject: Use modern memory barriers --- zix/ring.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) (limited to 'zix/ring.c') diff --git a/zix/ring.c b/zix/ring.c index 7932f2b..18a133d 100644 --- a/zix/ring.c +++ b/zix/ring.c @@ -30,23 +30,19 @@ # define ZIX_MLOCK(ptr, size) #endif -#if defined(__APPLE__) -# include -# define ZIX_FULL_BARRIER() OSMemoryBarrier() -#elif defined(_WIN32) +#if defined(_MSC_VER) # include -# define ZIX_FULL_BARRIER() MemoryBarrier() -#elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) -# define ZIX_FULL_BARRIER() __sync_synchronize() +# define ZIX_READ_BARRIER() MemoryBarrier() +# define ZIX_WRITE_BARRIER() MemoryBarrier() +#elif defined(__GNUC__) +# define ZIX_READ_BARRIER() __atomic_thread_fence(__ATOMIC_ACQUIRE) +# define ZIX_WRITE_BARRIER() __atomic_thread_fence(__ATOMIC_RELEASE) #else # pragma message("warning: No memory barriers, possible SMP bugs") -# define ZIX_FULL_BARRIER() +# define ZIX_READ_BARRIER() +# define ZIX_WRITE_BARRIER() #endif -/* No support for any systems with separate read and write barriers */ -#define ZIX_READ_BARRIER() ZIX_FULL_BARRIER() -#define ZIX_WRITE_BARRIER() ZIX_FULL_BARRIER() - struct ZixRingImpl { uint32_t write_head; ///< Read index into buf uint32_t read_head; ///< Write index into buf -- cgit v1.2.1