void lib_ring_buffer_switch_remote(struct lib_ring_buffer *buf);
extern
void lib_ring_buffer_switch_remote_empty(struct lib_ring_buffer *buf);
+extern
+void lib_ring_buffer_clear(struct lib_ring_buffer *buf);
/* Buffer write helpers */
consumed_new) != consumed_old));
}
+/*
+ * Move consumed position to the beginning of subbuffer in which the
+ * write offset is.
+ */
+static inline
+void lib_ring_buffer_clear_reader(struct lib_ring_buffer *buf,
+ struct channel *chan)
+{
+ const struct lib_ring_buffer_config *config = &chan->backend.config;
+ unsigned long offset, consumed_old, consumed_new;
+
+ do {
+ offset = v_read(config, &buf->offset);
+ consumed_old = atomic_long_read(&buf->consumed);
+ if (unlikely(subbuf_trunc(offset, chan)
+ - subbuf_trunc(consumed_old, chan)
+ > 0))
+ consumed_new = subbuf_trunc(offset, chan);
+ else
+ return;
+ } while (unlikely(atomic_long_cmpxchg(&buf->consumed, consumed_old,
+ consumed_new) != consumed_old));
+}
+
static inline
int lib_ring_buffer_pending_data(const struct lib_ring_buffer_config *config,
struct lib_ring_buffer *buf,