Browse Source

simplify read/write space calculations

This optimization is possible because the buffer size is always a power
of 2. See [1] for details.

[1]: https://github.com/drobilla/zix/pull/1#issuecomment-1212687196
pull/886/head
krasjet 2 years ago
parent
commit
d98f04113c
1 changed files with 6 additions and 32 deletions
  1. +6
    -32
      common/ringbuffer.c

+ 6
- 32
common/ringbuffer.c View File

@@ -183,11 +183,7 @@ jack_ringbuffer_read_space (const jack_ringbuffer_t * rb)
w = rb->write_ptr; JACK_ACQ_FENCE();
r = rb->read_ptr;

if (w > r) {
return w - r;
} else {
return (w - r + rb->size) & rb->size_mask;
}
return (w - r) & rb->size_mask;
}

/* Return the number of bytes available for writing. This is the
@@ -202,13 +198,7 @@ jack_ringbuffer_write_space (const jack_ringbuffer_t * rb)
w = rb->write_ptr;
r = rb->read_ptr; JACK_ACQ_FENCE();

if (w > r) {
return ((r - w + rb->size) & rb->size_mask) - 1;
} else if (w < r) {
return (r - w) - 1;
} else {
return rb->size - 1;
}
return (r - w - 1) & rb->size_mask;
}

/* The copying data reader. Copy at most `cnt' bytes from `rb' to
@@ -367,17 +357,10 @@ jack_ringbuffer_get_read_vector (const jack_ringbuffer_t * rb,
{
size_t free_cnt;
size_t cnt2;
size_t w, r;
size_t r;

w = rb->write_ptr; JACK_ACQ_FENCE();
r = rb->read_ptr;

if (w > r) {
free_cnt = w - r;
} else {
free_cnt = (w - r + rb->size) & rb->size_mask;
}

free_cnt = jack_ringbuffer_read_space(rb);
cnt2 = r + free_cnt;

if (cnt2 > rb->size) {
@@ -411,19 +394,10 @@ jack_ringbuffer_get_write_vector (const jack_ringbuffer_t * rb,
{
size_t free_cnt;
size_t cnt2;
size_t w, r;
size_t w;

w = rb->write_ptr;
r = rb->read_ptr; JACK_ACQ_FENCE();

if (w > r) {
free_cnt = ((r - w + rb->size) & rb->size_mask) - 1;
} else if (w < r) {
free_cnt = (r - w) - 1;
} else {
free_cnt = rb->size - 1;
}

free_cnt = jack_ringbuffer_write_space(rb);
cnt2 = w + free_cnt;

if (cnt2 > rb->size) {


Loading…
Cancel
Save