diff --git a/common/jack/ringbuffer.h b/common/jack/ringbuffer.h index 5204383c..70985720 100644 --- a/common/jack/ringbuffer.h +++ b/common/jack/ringbuffer.h @@ -50,8 +50,8 @@ jack_ringbuffer_data_t ; typedef struct { char *buf; - volatile size_t write_ptr; - volatile size_t read_ptr; + size_t write_ptr; + size_t read_ptr; size_t size; size_t size_mask; int mlocked; diff --git a/common/ringbuffer.c b/common/ringbuffer.c index fe12c473..9ba687a7 100644 --- a/common/ringbuffer.c +++ b/common/ringbuffer.c @@ -28,14 +28,20 @@ #include "JackCompilerDeps.h" /* Portable definitions for acquire and release fences */ -#if defined(_MSC_VER) && !defined(_M_AMD64) && !defined(_M_IX86) && !defined(_M_X64) - /* Acquire and release fences are only necessary for - * non-x86 systems. In fact, gcc will generate no - * instructions for acq/rel fences on x86. Hence, we only - * use MemoryBarrier() for non-x86 systems with msvc */ - #include - #define JACK_ACQ_FENCE() MemoryBarrier() - #define JACK_REL_FENCE() MemoryBarrier() +#if defined(_MSC_VER) + #if defined(_M_AMD64) || defined(_M_IX86) || defined(_M_X64) + /* Only compiler fences are needed on x86. In fact, GCC + * will generate no instructions for acq/rel fences on + * x86 */ + #include + #define JACK_ACQ_FENCE() _ReadBarrier() + #define JACK_REL_FENCE() _WriteBarrier() + #else + /* Use full memory fence for non-x86 systems with msvc */ + #include + #define JACK_ACQ_FENCE() MemoryBarrier() + #define JACK_REL_FENCE() MemoryBarrier() + #endif #elif defined(__GNUC__) #ifdef __ATOMIC_ACQUIRE #define JACK_ACQ_FENCE() __atomic_thread_fence(__ATOMIC_ACQUIRE) @@ -58,8 +64,8 @@ jack_ringbuffer_data_t ; typedef struct { char *buf; - volatile size_t write_ptr; - volatile size_t read_ptr; + size_t write_ptr; + size_t read_ptr; size_t size; size_t size_mask; int mlocked;