if (!trace) {
trace = g_new0(struct lttng_live_ctf_trace, 1);
trace->ctf_trace_id = ctf_trace_id;
+ trace->trace_id = -1;
printf_verbose("Create trace ctf_trace_id %" PRIu64 "\n", ctf_trace_id);
BT_INIT_LIST_HEAD(&trace->stream_list);
g_hash_table_insert(stream->session->ctf_traces,
viewer_stream->in_trace = 0;
bt_list_del(&viewer_stream->trace_stream_node);
bt_list_del(&viewer_stream->session_stream_node);
- g_free(viewer_stream);
*stream_id = be64toh(rp->stream_id);
+ g_free(viewer_stream);
break;
case LTTNG_VIEWER_INDEX_ERR:
fprintf(stderr, "[error] get_next_index: error\n");
ret = handle_seek_position(index, whence, viewer_stream, pos,
file_stream);
if (ret != 0) {
- return;
+ ret = -BT_PACKET_SEEK_ERROR;
+ goto end;
}
retry:
if (!lttng_live_should_quit()) {
fprintf(stderr, "[error] get_next_index failed\n");
}
- return;
+ ret = -BT_PACKET_SEEK_ERROR;
+ goto end;
}
printf_verbose("Index received : packet_size : %" PRIu64
", offset %" PRIu64 ", content_size %" PRIu64
file_stream->parent.stream_id = stream_id;
viewer_stream->ctf_stream_id = stream_id;
- return;
+ ret = 0;
+ goto end;
}
pos->packet_size = cur_index->packet_size;
pos->offset = EOF;
if (!lttng_live_should_quit()) {
fprintf(stderr, "[error] get_data_packet failed\n");
+ ret = -BT_PACKET_SEEK_ERROR;
+ } else {
+ ret = 0;
}
- return;
+ goto end;
}
viewer_stream->data_pending = 0;
read_packet_header(pos, file_stream);
-
+ ret = 0;
end:
- return;
+ bt_packet_seek_set_error(ret);
}
int lttng_live_create_viewer_session(struct lttng_live_ctx *ctx)
lvstream->in_trace = 0;
bt_list_del(&lvstream->trace_stream_node);
}
- if (trace->in_use) {
+ if (trace->in_use && trace->trace_id >= 0) {
ret = bt_context_remove_trace(bt_ctx, trace->trace_id);
if (ret < 0)
fprintf(stderr, "[error] removing trace from context\n");
ret = 0;
goto end;
}
+ /*
+ * add_one_trace can be called recursively if during the
+ * bt_context_add_trace call we need to fetch new streams, so we need to
+ * prevent a recursive call to process our current trace.
+ */
+ trace->in_use = 1;
BT_INIT_LIST_HEAD(&mmap_list.head);
}
trace->trace_id = ret;
- trace->in_use = 1;
printf_verbose("Trace now in use, id = %d\n", trace->trace_id);
goto end;
GHashTableIter it;
gpointer key;
gpointer value;
+ unsigned int nr_traces;
printf_verbose("Begin add traces\n");
+retry:
+ nr_traces = g_hash_table_size(ctx->session->ctf_traces);
+
ret = check_traces_metadata(ctx);
if (ret < 0) {
goto end;
if (ret < 0) {
goto end;
}
+ /*
+ * If a new trace got added while we were adding the trace, the
+ * iterator is invalid and we have to restart.
+ */
+ if (g_hash_table_size(ctx->session->ctf_traces) != nr_traces) {
+ printf_verbose("New trace(s) added during add_one_trace()\n");
+ goto retry;
+ }
}
ret = 0;