diff options
author | David Robillard <d@drobilla.net> | 2020-08-13 17:25:45 +0200 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2020-08-13 17:25:45 +0200 |
commit | 84addbedee65322625a101f1cf5a97860a26b1ef (patch) | |
tree | 4836da0e296cd44b7aa7902882f5d977fe2e898e /zix/ring.c | |
parent | 4aafa4a63ad9b86b3910e4f3607792ebe45bb329 (diff) | |
download | zix-84addbedee65322625a101f1cf5a97860a26b1ef.tar.gz zix-84addbedee65322625a101f1cf5a97860a26b1ef.tar.bz2 zix-84addbedee65322625a101f1cf5a97860a26b1ef.zip |
Use modern memory barriers
Diffstat (limited to 'zix/ring.c')
-rw-r--r-- | zix/ring.c | 20 |
1 files changed, 8 insertions, 12 deletions
@@ -30,23 +30,19 @@ # define ZIX_MLOCK(ptr, size) #endif -#if defined(__APPLE__) -# include <libkern/OSAtomic.h> -# define ZIX_FULL_BARRIER() OSMemoryBarrier() -#elif defined(_WIN32) +#if defined(_MSC_VER) # include <windows.h> -# 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 |