Browse Source

remove volatile qualifier on ringbuf r/w pointers

The volatile constraints are excess when compiler barriers are present.
It generates unnecessary `mov` instructions when pointers aren't going
to be updated.
pull/886/head
krasjet 3 years ago
parent
commit
5a75deab04
2 changed files with 18 additions and 12 deletions
  1. +2
    -2
      common/jack/ringbuffer.h
  2. +16
    -10
      common/ringbuffer.c

+ 2
- 2
common/jack/ringbuffer.h View File

@@ -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;


+ 16
- 10
common/ringbuffer.c View File

@@ -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 <windows.h>
#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 <intrin.h>
#define JACK_ACQ_FENCE() _ReadBarrier()
#define JACK_REL_FENCE() _WriteBarrier()
#else
/* Use full memory fence for non-x86 systems with msvc */
#include <windows.h>
#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;


Loading…
Cancel
Save