#include <glib.h>
#include <inttypes.h>
+#include <stdbool.h>
#include <unistd.h>
#include "common/assert.h"
{
enum lttng_live_iterator_status status;
uint64_t trace_idx;
- int ret = 0;
if (!session->attached) {
- ret = lttng_live_attach_session(session);
- if (ret) {
+ enum lttng_live_attach_session_status attach_status =
+ lttng_live_attach_session(session);
+ if (attach_status != LTTNG_LIVE_ATTACH_SESSION_STATUS_OK) {
if (lttng_live_graph_is_canceled(lttng_live_msg_iter)) {
status = LTTNG_LIVE_ITERATOR_STATUS_AGAIN;
} else {
status != LTTNG_LIVE_ITERATOR_STATUS_END) {
goto end;
}
- for (trace_idx = 0; trace_idx < session->traces->len; trace_idx++) {
+ trace_idx = 0;
+ while (trace_idx < session->traces->len) {
struct lttng_live_trace *trace =
g_ptr_array_index(session->traces, trace_idx);
status = lttng_live_metadata_update(trace);
- if (status != LTTNG_LIVE_ITERATOR_STATUS_OK &&
- status != LTTNG_LIVE_ITERATOR_STATUS_END) {
+ switch (status) {
+ case LTTNG_LIVE_ITERATOR_STATUS_OK:
+ trace_idx++;
+ break;
+ case LTTNG_LIVE_ITERATOR_STATUS_END:
+ /*
+ * The trace has ended. Remove it of the array an
+ * continue the iteration.
+ * We can remove the trace safely when using the
+ * g_ptr_array_remove_index_fast because it replaces
+ * the element at trace_idx with the array's last
+ * element. trace_idx is not incremented because of
+ * that.
+ */
+ (void) g_ptr_array_remove_index_fast(session->traces,
+ trace_idx);
+ break;
+ default:
goto end;
}
}