Fix: uninitialized variable in lib_ring_buffer_reserve_committed
[lttng-ust.git] / libringbuffer / frontend_internal.h
index 323a8df7f98cd7e5d3aba69302c6c291799b8bbd..1a9c2d4b78e82e7645e1267430b41e6f0c3218c2 100644 (file)
@@ -205,6 +205,32 @@ void lib_ring_buffer_reserve_push_reader(struct lttng_ust_lib_ring_buffer *buf,
                                              consumed_new) != consumed_old));
 }
 
+static inline
+void lib_ring_buffer_clear_reader(struct lttng_ust_lib_ring_buffer *buf,
+                                 struct lttng_ust_shm_handle *handle)
+{
+       struct channel *chan;
+       const struct lttng_ust_lib_ring_buffer_config *config;
+       unsigned long offset, consumed_old, consumed_new;
+
+       chan = shmp(handle, buf->backend.chan);
+       if (!chan)
+               return;
+       config = &chan->backend.config;
+
+       do {
+               offset = v_read(config, &buf->offset);
+               consumed_old = uatomic_read(&buf->consumed);
+               if (caa_unlikely(subbuf_trunc(offset, chan)
+                             - subbuf_trunc(consumed_old, chan)
+                            > 0))
+                       consumed_new = subbuf_trunc(offset, chan);
+               else
+                       return;
+       } while (caa_unlikely(uatomic_cmpxchg(&buf->consumed, consumed_old,
+                                             consumed_new) != consumed_old));
+}
+
 static inline
 int lib_ring_buffer_pending_data(const struct lttng_ust_lib_ring_buffer_config *config,
                                 struct lttng_ust_lib_ring_buffer *buf,
@@ -234,14 +260,11 @@ int lib_ring_buffer_reserve_committed(const struct lttng_ust_lib_ring_buffer_con
                                      struct lttng_ust_shm_handle *handle)
 {
        unsigned long offset, idx, commit_count;
-       struct commit_counters_hot *cc_hot = shmp_index(handle, buf->commit_hot, idx);
+       struct commit_counters_hot *cc_hot;
 
        CHAN_WARN_ON(chan, config->alloc != RING_BUFFER_ALLOC_PER_CPU);
        CHAN_WARN_ON(chan, config->sync != RING_BUFFER_SYNC_PER_CPU);
 
-       if (caa_unlikely(!cc_hot))
-               return 0;
-
        /*
         * Read offset and commit count in a loop so they are both read
         * atomically wrt interrupts. By deal with interrupt concurrency by
@@ -253,6 +276,9 @@ int lib_ring_buffer_reserve_committed(const struct lttng_ust_lib_ring_buffer_con
        do {
                offset = v_read(config, &buf->offset);
                idx = subbuf_index(offset, chan);
+               cc_hot = shmp_index(handle, buf->commit_hot, idx);
+               if (caa_unlikely(!cc_hot))
+                       return 0;
                commit_count = v_read(config, &cc_hot->cc);
        } while (offset != v_read(config, &buf->offset));
 
This page took 0.026009 seconds and 4 git commands to generate.