g_ptr_array_index(live_trace->stream_iterators,
stream_iter_idx);
- /*
- * Since we may remove elements from the GPtrArray as we
- * iterate over it, it's possible to see the same element more
- * than once.
- */
- if (stream_iter == youngest_candidate_stream_iter) {
- stream_iter_idx++;
- continue;
- }
-
/*
* Find if there is are now current message for this stream
* iterator get it.
stream_iter_idx++;
} else {
/*
- * The live stream iterator is ENDed. We remove that
- * iterator from the list and we restart the iteration
- * at the beginning of the live stream iterator array
- * to because the removal will shuffle the array.
+ * The live stream iterator has ended. That
+ * iterator is removed from the array, but
+ * there is no need to increment
+ * stream_iter_idx as
+ * g_ptr_array_remove_index_fast replaces the
+ * removed element with the array's last
+ * element.
*/
- g_ptr_array_remove_index_fast(live_trace->stream_iterators,
+ g_ptr_array_remove_index_fast(
+ live_trace->stream_iterators,
stream_iter_idx);
- stream_iter_idx = 0;
}
}
BT_ASSERT_DBG(session->traces);
- /*
- * Use while loops here rather then for loops so we can restart the
- * iteration if an element is removed from the array during the
- * looping.
- */
while (trace_idx < session->traces->len) {
bool trace_is_ended = false;
struct lttng_live_stream_iterator *stream_iter;
}
trace_idx++;
} else {
- g_ptr_array_remove_index_fast(session->traces, trace_idx);
- trace_idx = 0;
+ /*
+ * trace_idx is not incremented since
+ * g_ptr_array_remove_index_fast replaces the
+ * element at trace_idx with the array's last element.
+ */
+ g_ptr_array_remove_index_fast(session->traces,
+ trace_idx);
}
}
if (youngest_candidate_stream_iter) {