From d98f04113ca0cb40d75e6ee50ad36daffff63a3f Mon Sep 17 00:00:00 2001 From: krasjet Date: Fri, 12 Aug 2022 18:17:33 +0000 Subject: [PATCH] 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 --- common/ringbuffer.c | 38 ++++++-------------------------------- 1 file changed, 6 insertions(+), 32 deletions(-) diff --git a/common/ringbuffer.c b/common/ringbuffer.c index 9ba687a7..dc4efc65 100644 --- a/common/ringbuffer.c +++ b/common/ringbuffer.c @@ -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) {