Don't restart the iteration on a session array when a session has to
be removed. The contents of the array's current position are replaced
by the contents of the last position in the array. Thus, we can
continue the iteration from the current index.
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: If058fe4b10c9c422b9f54edd63900b6804bbe8e2
Reviewed-on: https://review.lttng.org/c/babeltrace/+/2264
Reviewed-by: Simon Marchi <simon.marchi@efficios.com>
BT_ASSERT_DBG(lttng_live_msg_iter->sessions);
session_idx = 0;
BT_ASSERT_DBG(lttng_live_msg_iter->sessions);
session_idx = 0;
- /*
- * Use a while loop instead of a for loop so we can restart the
- * iteration if we remove an element. We can safely call
- * next_stream_iterator_for_session() multiple times on the
- * same session as we only fetch a new message if there is no
- * current next message for each live stream iterator.
- * If all live stream iterator of that session already have a
- * current next message, the function will simply exit return
- * the same candidate live stream iterator every time.
- */
while (session_idx < lttng_live_msg_iter->sessions->len) {
struct lttng_live_session *session =
g_ptr_array_index(lttng_live_msg_iter->sessions,
while (session_idx < lttng_live_msg_iter->sessions->len) {
struct lttng_live_session *session =
g_ptr_array_index(lttng_live_msg_iter->sessions,
if (stream_iter_status == LTTNG_LIVE_ITERATOR_STATUS_END) {
if (session->closed && session->traces->len == 0) {
/*
if (stream_iter_status == LTTNG_LIVE_ITERATOR_STATUS_END) {
if (session->closed && session->traces->len == 0) {
/*
- * Remove the session from the list and restart the
- * iteration at the beginning of the array since the
- * removal shuffle the elements of the array.
+ * Remove the session from the list.
+ * session_idx is not modified since
+ * g_ptr_array_remove_index_fast
+ * replaces the the removed element with
+ * the array's last element.
*/
g_ptr_array_remove_index_fast(
lttng_live_msg_iter->sessions,
session_idx);
*/
g_ptr_array_remove_index_fast(
lttng_live_msg_iter->sessions,
session_idx);
} else {
session_idx++;
}
} else {
session_idx++;
}