X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=formats%2Fctf%2Fmetadata%2Fctf-visitor-generate-io-struct.c;h=de9986113de508f36bfe66ac5950c6786da728ef;hp=0e9fe7961845ca9b99c8d7d30d881eb1bb26fc58;hb=b448902b7c2d8fa734e0d5cb1e6acbb009db97e4;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..de998611 100644 --- a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c +++ b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c @@ -2507,6 +2507,19 @@ int ctf_callsite_declaration_visit(FILE *fd, int depth, struct ctf_node *node, goto error; } CTF_CALLSITE_SET_FIELD(callsite, line); + } else if (!strcmp(left, "ip")) { + if (CTF_CALLSITE_FIELD_IS_SET(callsite, ip)) { + fprintf(fd, "[error] %s: ip already declared in callsite declaration\n", __func__); + ret = -EPERM; + goto error; + } + ret = get_unary_unsigned(&node->u.ctf_expression.right, &callsite->ip); + if (ret) { + fprintf(fd, "[error] %s: unexpected unary expression for callsite ip\n", __func__); + ret = -EINVAL; + goto error; + } + CTF_CALLSITE_SET_FIELD(callsite, ip); } else { fprintf(fd, "[warning] %s: attribute \"%s\" is unknown in callsite declaration.\n", __func__, left); } @@ -2529,6 +2542,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 +2571,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 +2592,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