From d86d62f815e8fce21a7efb2cc0811720d62b0c11 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Tue, 6 Dec 2011 11:47:53 -0500 Subject: [PATCH] Add loglevel support Signed-off-by: Mathieu Desnoyers --- converter/babeltrace.c | 5 +- formats/ctf-text/ctf-text.c | 18 ++++++- .../metadata/ctf-visitor-generate-io-struct.c | 47 +++++++++++++++++++ include/babeltrace/babeltrace-internal.h | 3 +- include/babeltrace/ctf-ir/metadata.h | 10 ++-- 5 files changed, 77 insertions(+), 6 deletions(-) diff --git a/converter/babeltrace.c b/converter/babeltrace.c index 2c1c4440..2870df8f 100644 --- a/converter/babeltrace.c +++ b/converter/babeltrace.c @@ -99,7 +99,8 @@ static void usage(FILE *fp) fprintf(fp, " Available field names:\n"); fprintf(fp, " (payload OR args OR arg)\n"); fprintf(fp, " all, scope, header, (context OR ctx)\n"); - fprintf(fp, " trace, trace:domain, trace:procname, trace:vpid\n"); + fprintf(fp, " trace, trace:domain, trace:procname, trace:vpid,\n"); + fprintf(fp, " loglevel.\n"); fprintf(fp, " (payload active by default)\n"); list_formats(fp); fprintf(fp, "\n"); @@ -134,6 +135,8 @@ static int get_names_args(poptContext *pc) opt_trace_procname = 1; else if (!strcmp(str, "trace:vpid")) opt_trace_vpid = 1; + else if (!strcmp(str, "loglevel")) + opt_loglevel = 1; else { fprintf(stdout, "[error] unknown field name type %s\n", str); return -EINVAL; diff --git a/formats/ctf-text/ctf-text.c b/formats/ctf-text/ctf-text.c index 9b5f98be..1b3e4bc7 100644 --- a/formats/ctf-text/ctf-text.c +++ b/formats/ctf-text/ctf-text.c @@ -42,7 +42,8 @@ int opt_all_field_names, opt_trace_name, opt_trace_domain, opt_trace_procname, - opt_trace_vpid; + opt_trace_vpid, + opt_loglevel; enum field_item { ITEM_SCOPE, @@ -244,6 +245,21 @@ int ctf_text_write_event(struct stream_pos *ppos, fprintf(pos->fp, ", "); dom_print = 1; } + if ((opt_loglevel || opt_all_field_names) && event_class->loglevel_identifier != 0) { + set_field_names_print(pos, ITEM_HEADER); + if (pos->print_names) { + fprintf(pos->fp, "loglevel = "); + } else if (dom_print) { + fprintf(pos->fp, ":"); + } + + fprintf(pos->fp, "%s (%lld)", + g_quark_to_string(event_class->loglevel_identifier), + (long long) event_class->loglevel_value); + if (pos->print_names) + fprintf(pos->fp, ", "); + dom_print = 1; + } if (dom_print && !pos->print_names) fprintf(pos->fp, " "); set_field_names_print(pos, ITEM_HEADER); diff --git a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c index 82af10a1..6e828fcd 100644 --- a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c +++ b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c @@ -104,6 +104,23 @@ int get_unary_unsigned(struct cds_list_head *head, uint64_t *value) return 0; } +static +int get_unary_signed(struct cds_list_head *head, int64_t *value) +{ + struct ctf_node *node; + int i = 0; + + cds_list_for_each_entry(node, head, siblings) { + assert(node->type == NODE_UNARY_EXPRESSION); + assert(node->u.unary_expression.type == UNARY_UNSIGNED_CONSTANT); + assert(node->u.unary_expression.link == UNARY_LINK_UNKNOWN); + assert(i == 0); + *value = node->u.unary_expression.u.signed_constant; + i++; + } + return 0; +} + static int get_unary_uuid(struct cds_list_head *head, uuid_t *uuid) { @@ -1550,6 +1567,36 @@ int ctf_event_declaration_visit(FILE *fd, int depth, struct ctf_node *node, stru goto error; } event->fields_decl = container_of(declaration, struct declaration_struct, p); + } else if (!strcmp(left, "loglevel.identifier")) { + char *right; + + if (CTF_EVENT_FIELD_IS_SET(event, loglevel_identifier)) { + fprintf(fd, "[error] %s: identifier already declared in event declaration\n", __func__); + ret = -EPERM; + goto error; + } + right = concatenate_unary_strings(&node->u.ctf_expression.right); + if (!right) { + fprintf(fd, "[error] %s: unexpected unary expression for event identifier\n", __func__); + ret = -EINVAL; + goto error; + } + event->loglevel_identifier = g_quark_from_string(right); + g_free(right); + CTF_EVENT_SET_FIELD(event, loglevel_identifier); + } else if (!strcmp(left, "loglevel.value")) { + if (CTF_EVENT_FIELD_IS_SET(event, loglevel_value)) { + fprintf(fd, "[error] %s: loglevel value already declared in event declaration\n", __func__); + ret = -EPERM; + goto error; + } + ret = get_unary_signed(&node->u.ctf_expression.right, &event->loglevel_value); + if (ret) { + fprintf(fd, "[error] %s: unexpected unary expression for event loglevel value\n", __func__); + ret = -EINVAL; + goto error; + } + CTF_EVENT_SET_FIELD(event, loglevel_value); } else { fprintf(fd, "[error] %s: attribute \"%s\" is unknown in event declaration.\n", __func__, left); ret = -EINVAL; diff --git a/include/babeltrace/babeltrace-internal.h b/include/babeltrace/babeltrace-internal.h index 58af9c90..991e23c4 100644 --- a/include/babeltrace/babeltrace-internal.h +++ b/include/babeltrace/babeltrace-internal.h @@ -37,6 +37,7 @@ extern int opt_all_field_names, opt_trace_name, opt_trace_domain, opt_trace_procname, - opt_trace_vpid; + opt_trace_vpid, + opt_loglevel; #endif diff --git a/include/babeltrace/ctf-ir/metadata.h b/include/babeltrace/ctf-ir/metadata.h index 3f03504e..2d216f2f 100644 --- a/include/babeltrace/ctf-ir/metadata.h +++ b/include/babeltrace/ctf-ir/metadata.h @@ -171,11 +171,15 @@ struct ctf_event { GQuark name; uint64_t id; /* Numeric identifier within the stream */ uint64_t stream_id; + GQuark loglevel_identifier; + int64_t loglevel_value; enum { /* Fields populated mask */ - CTF_EVENT_name = (1 << 0), - CTF_EVENT_id = (1 << 1), - CTF_EVENT_stream_id = (1 << 2), + CTF_EVENT_name = (1 << 0), + CTF_EVENT_id = (1 << 1), + CTF_EVENT_stream_id = (1 << 2), + CTF_EVENT_loglevel_identifier = (1 << 3), + CTF_EVENT_loglevel_value = (1 << 4), } field_mask; }; -- 2.34.1