From 3730724040e3a09c58c15f387bd8fff47dc12eb4 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Mon, 26 Jan 2015 17:29:26 -0500 Subject: [PATCH] Fix: handle 64-bit trace IDs on 32-bit systems Signed-off-by: Mathieu Desnoyers --- formats/lttng-live/lttng-live-comm.c | 4 ++-- formats/lttng-live/lttng-live-plugin.c | 28 ++++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/formats/lttng-live/lttng-live-comm.c b/formats/lttng-live/lttng-live-comm.c index 5205a67a..a44516de 100644 --- a/formats/lttng-live/lttng-live-comm.c +++ b/formats/lttng-live/lttng-live-comm.c @@ -381,13 +381,13 @@ int lttng_live_ctf_trace_assign(struct lttng_live_viewer_stream *stream, int ret = 0; trace = g_hash_table_lookup(stream->session->ctf_traces, - (gpointer) ctf_trace_id); + &ctf_trace_id); if (!trace) { trace = g_new0(struct lttng_live_ctf_trace, 1); trace->ctf_trace_id = ctf_trace_id; trace->streams = g_ptr_array_new(); g_hash_table_insert(stream->session->ctf_traces, - (gpointer) ctf_trace_id, + &trace->ctf_trace_id, trace); } if (stream->metadata_flag) diff --git a/formats/lttng-live/lttng-live-plugin.c b/formats/lttng-live/lttng-live-plugin.c index d7ea14a0..643129c8 100644 --- a/formats/lttng-live/lttng-live-plugin.c +++ b/formats/lttng-live/lttng-live-plugin.c @@ -187,6 +187,30 @@ end: return ret; } +static +guint g_uint64p_hash(gconstpointer key) +{ + uint64_t v = *(uint64_t *) key; + + if (sizeof(gconstpointer) == sizeof(uint64_t)) { + return g_direct_hash((gconstpointer) (unsigned long) v); + } else { + return g_direct_hash((gconstpointer) (unsigned long) (v >> 32)) + ^ g_direct_hash((gconstpointer) (unsigned long) v); + } +} + +static +gboolean g_uint64p_equal(gconstpointer a, gconstpointer b) +{ + uint64_t va = *(uint64_t *) a; + uint64_t vb = *(uint64_t *) b; + + if (va != vb) + return FALSE; + return TRUE; +} + static int lttng_live_open_trace_read(const char *path) { int ret = 0; @@ -199,8 +223,8 @@ static int lttng_live_open_trace_read(const char *path) ctx->session->ctx = ctx; /* HT to store the CTF traces. */ - ctx->session->ctf_traces = g_hash_table_new(g_direct_hash, - g_direct_equal); + ctx->session->ctf_traces = g_hash_table_new(g_uint64p_hash, + g_uint64p_equal); ctx->port = -1; ctx->session_ids = g_array_new(FALSE, TRUE, sizeof(uint64_t)); -- 2.34.1