Skip to content

Commit

Permalink
updated ringbuffer macros as per discussion on #109
Browse files Browse the repository at this point in the history
  • Loading branch information
danomatika committed Apr 1, 2016
1 parent de69981 commit 1d834b8
Showing 1 changed file with 12 additions and 12 deletions.
24 changes: 12 additions & 12 deletions libpd_wrapper/util/ringbuffer.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,16 @@

#ifdef __APPLE__ // apple atomics
# include <libkern/OSAtomic.h>
# define SYNC_FETCH(ptr, val) OSAtomicOr32Barrier(val, ptr)
# define SYNC_COMPARE(ptr, oldval, newval) \
# define SYNC_FETCH(ptr) OSAtomicOr32Barrier(0, (volatile uint32_t *)ptr)
# define SYNC_COMPARE_AND_SWAP(ptr, oldval, newval) \
OSAtomicCompareAndSwap32Barrier(oldval, newval, ptr)
#elif defined(_MSC_VER) // win api atomics
# define SYNC_FETCH(ptr, val) InterlockedOr(ptr, val)
# define SYNC_COMPARE(ptr, oldval, newval) \
# define SYNC_FETCH(ptr) InterlockedOr(ptr, 0)
# define SYNC_COMPARE_AND_SWAP(ptr, oldval, newval) \
InterlockedCompareExchange(ptr, oldval, newval)
#else // gcc atomics
# define SYNC_FETCH(ptr, val) __sync_fetch_and_or(ptr, val)
# define SYNC_COMPARE(ptr, oldval, newval) \
# define SYNC_FETCH(ptr) __sync_fetch_and_or(ptr, 0)
# define SYNC_COMPARE_AND_SWAP(ptr, oldval, newval) \
__sync_val_compare_and_swap(ptr, oldval, newval)
#endif

Expand Down Expand Up @@ -54,8 +54,8 @@ int rb_available_to_write(ring_buffer *buffer) {
// Note: The largest possible result is buffer->size - 1 because
// we adopt the convention that read_idx == write_idx means that the
// buffer is empty.
int read_idx = SYNC_FETCH(&(buffer->read_idx), 0);
int write_idx = SYNC_FETCH(&(buffer->write_idx), 0);
int read_idx = SYNC_FETCH(&(buffer->read_idx));
int write_idx = SYNC_FETCH(&(buffer->write_idx));
return (buffer->size + read_idx - write_idx - 1) % buffer->size;
} else {
return 0;
Expand All @@ -64,8 +64,8 @@ int rb_available_to_write(ring_buffer *buffer) {

int rb_available_to_read(ring_buffer *buffer) {
if (buffer) {
int read_idx = SYNC_FETCH(&(buffer->read_idx), 0);
int write_idx = SYNC_FETCH(&(buffer->write_idx), 0);
int read_idx = SYNC_FETCH(&(buffer->read_idx));
int write_idx = SYNC_FETCH(&(buffer->write_idx));
return (buffer->size + write_idx - read_idx) % buffer->size;
} else {
return 0;
Expand Down Expand Up @@ -94,7 +94,7 @@ int rb_write_to_buffer(ring_buffer *buffer, int n, ...) {
write_idx = (write_idx + len) % buffer->size;
}
va_end(args);
SYNC_COMPARE(&(buffer->write_idx), buffer->write_idx,
SYNC_COMPARE_AND_SWAP(&(buffer->write_idx), buffer->write_idx,
write_idx); // Includes memory barrier.
return 0;
}
Expand All @@ -113,7 +113,7 @@ int rb_read_from_buffer(ring_buffer *buffer, char *dest, int len) {
memcpy(dest, buffer->buf_ptr + read_idx, d);
memcpy(dest + d, buffer->buf_ptr, len - d);
}
SYNC_COMPARE(&(buffer->read_idx), buffer->read_idx,
SYNC_COMPARE_AND_SWAP(&(buffer->read_idx), buffer->read_idx,
(read_idx + len) % buffer->size); // Includes memory barrier.
return 0;
}

0 comments on commit 1d834b8

Please sign in to comment.