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
This commit is contained in:
krasjet 2022-08-12 18:17:33 +00:00 committed by Nedko Arnaudov
parent 06749e0c67
commit 4ab3b0744a
1 changed files with 6 additions and 32 deletions

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) {