From c352d3a43a6bb0d875112699ee6ef3b9f8962150 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Wed, 27 Feb 2013 16:39:30 -0500 Subject: [PATCH] Fix: don't flush-final for offset 0 if reader is on sub-buffer Signed-off-by: Mathieu Desnoyers --- libringbuffer/ring_buffer_frontend.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/libringbuffer/ring_buffer_frontend.c b/libringbuffer/ring_buffer_frontend.c index 7762da72..6719626c 100644 --- a/libringbuffer/ring_buffer_frontend.c +++ b/libringbuffer/ring_buffer_frontend.c @@ -1233,6 +1233,19 @@ int lib_ring_buffer_try_switch_slow(enum switch_mode mode, */ if (mode == SWITCH_FLUSH || off > 0) { if (caa_unlikely(off == 0)) { + /* + * A final flush that encounters an empty + * sub-buffer cannot switch buffer if a + * reader is located within this sub-buffer. + * Anyway, the purpose of final flushing of a + * sub-buffer at offset 0 is to handle the case + * of entirely empty stream. + */ + if (caa_unlikely(subbuf_trunc(offsets->begin, chan) + - subbuf_trunc((unsigned long) + uatomic_read(&buf->consumed), chan) + >= chan->backend.buf_size)) + return -1; /* * The client does not save any header information. * Don't switch empty subbuffer on finalize, because it -- 2.34.1