From: Jonathan Rajotte Date: Tue, 3 Jul 2018 16:28:54 +0000 (-0400) Subject: Use trace->trace_id in check to remove trace from bt_ctx X-Git-Tag: v1.5.6~2 X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=commitdiff_plain;h=c8a683194ae8caef6592cd235bf1666001d8d4cd Use trace->trace_id in check to remove trace from bt_ctx Commit b9e6498df8b3e7c2ad312dccddf9f1a5e181648e removes the existence guarantee of the trace_id hash table key by moving the trace->in_use assignation before the assignation of trace_id and insertion into the hash table. Use the trade_id field value to validate if it should be removed from the hash table. A NULL trace_id field indicates that no insertion was performed. This is mostly a workaround to a problem found in, at least, glib 2.28 where g_hash_table_lookup_node() aborts on a SIGFPE signal due to modulo by zero. The exact cause for this is unknown for now, but a similar problem was reported against Nautilus [1]. There is little reason for "mod" to be 0 at that point, as explained in the bug report. Currently unable to reproduce. [1] https://bugzilla.redhat.com/show_bug.cgi?id=1074401 Signed-off-by: Jonathan Rajotte Signed-off-by: Jérémie Galarneau --- diff --git a/formats/lttng-live/lttng-live-comm.c b/formats/lttng-live/lttng-live-comm.c index 055b1c30..ec03fb2f 100644 --- a/formats/lttng-live/lttng-live-comm.c +++ b/formats/lttng-live/lttng-live-comm.c @@ -390,6 +390,7 @@ int lttng_live_ctf_trace_assign(struct lttng_live_viewer_stream *stream, 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, @@ -1466,7 +1467,7 @@ int del_traces(gpointer key, gpointer value, gpointer user_data) 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"); diff --git a/formats/lttng-live/lttng-live.h b/formats/lttng-live/lttng-live.h index 9739078a..34c57ede 100644 --- a/formats/lttng-live/lttng-live.h +++ b/formats/lttng-live/lttng-live.h @@ -88,6 +88,7 @@ struct lttng_live_ctf_trace { struct bt_list_head stream_list; FILE *metadata_fp; struct bt_trace_handle *handle; + /* Set to -1 when not initialized. */ int trace_id; int in_use; };