X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf%2Fmetadata%2Fctf-visitor-generate-io-struct.c;h=9be7e161a237f27c0e57eb8bf6d4edab6d72a09d;hp=0e9fe7961845ca9b99c8d7d30d881eb1bb26fc58;hb=c5ff71a3430f00d29c0c6d133ee38dcfe7e4d20a;hpb=f133896d405417ba90ac250d243d4b8e539e98f1 diff --git a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c index 0e9fe796..9be7e161 100644 --- a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c +++ b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c @@ -2529,6 +2529,7 @@ int ctf_callsite_visit(FILE *fd, int depth, struct ctf_node *node, struct ctf_tr int ret = 0; struct ctf_node *iter; struct ctf_callsite *callsite; + struct ctf_callsite_dups *cs_dups; callsite = g_new0(struct ctf_callsite, 1); bt_list_for_each_entry(iter, &node->u.callsite.declaration_list, siblings) { @@ -2557,7 +2558,15 @@ int ctf_callsite_visit(FILE *fd, int depth, struct ctf_node *node, struct ctf_tr goto error; } - g_hash_table_insert(trace->callsites, (gpointer) (unsigned long) callsite->name, callsite); + cs_dups = g_hash_table_lookup(trace->callsites, + (gpointer) (unsigned long) callsite->name); + if (!cs_dups) { + cs_dups = g_new0(struct ctf_callsite_dups, 1); + BT_INIT_LIST_HEAD(&cs_dups->head); + g_hash_table_insert(trace->callsites, + (gpointer) (unsigned long) callsite->name, cs_dups); + } + bt_list_add_tail(&callsite->node, &cs_dups->head); return 0; error: @@ -2570,11 +2579,14 @@ error: static void callsite_free(gpointer data) { - struct ctf_callsite *callsite = data; + struct ctf_callsite_dups *cs_dups = data; + struct ctf_callsite *callsite, *cs_n; - g_free(callsite->func); - g_free(callsite->file); - g_free(callsite); + bt_list_for_each_entry_safe(callsite, cs_n, &cs_dups->head, node) { + g_free(callsite->func); + g_free(callsite->file); + g_free(callsite); + } } static