From e003ab503def7b0db6c130cccbc03685adb32bbb Mon Sep 17 00:00:00 2001 From: Julien Desfossez Date: Tue, 3 Apr 2012 20:14:56 -0400 Subject: [PATCH] API : list of events in the trace This function exports the list of events enabled in a trace. Signed-off-by: Julien Desfossez Signed-off-by: Mathieu Desnoyers --- formats/ctf/ctf.c | 10 ++++++ formats/ctf/events.c | 34 +++++++++++++++++++ .../metadata/ctf-visitor-generate-io-struct.c | 10 ++++-- include/babeltrace/ctf-ir/metadata.h | 1 + include/babeltrace/ctf/events-internal.h | 2 +- include/babeltrace/ctf/events.h | 17 ++++++++++ 6 files changed, 71 insertions(+), 3 deletions(-) diff --git a/formats/ctf/ctf.c b/formats/ctf/ctf.c index 65b4cf76..91fc20c3 100644 --- a/formats/ctf/ctf.c +++ b/formats/ctf/ctf.c @@ -1617,6 +1617,16 @@ void ctf_close_trace(struct trace_descriptor *tdp) } g_ptr_array_free(td->streams, TRUE); } + + if (td->event_declarations) { + for (i = 0; i < td->event_declarations->len; i++) { + struct bt_ctf_event_decl *event; + + event = g_ptr_array_index(td->event_declarations, i); + g_free(event); + } + g_ptr_array_free(td->event_declarations, TRUE); + } closedir(td->dir); g_free(td); } diff --git a/formats/ctf/events.c b/formats/ctf/events.c index b33796bc..13c7411a 100644 --- a/formats/ctf/events.c +++ b/formats/ctf/events.c @@ -441,3 +441,37 @@ char *bt_ctf_get_string(const struct definition *field) return ret; } + +int bt_ctf_get_event_decl_list(int handle_id, struct bt_context *ctx, + struct bt_ctf_event_decl const * const **list, + unsigned int *count) +{ + struct bt_trace_handle *handle; + struct trace_descriptor *td; + struct ctf_trace *tin; + + if (!ctx) + goto error; + + handle = g_hash_table_lookup(ctx->trace_handles, + (gpointer) (unsigned long) handle_id); + if (!handle) + goto error; + + td = handle->td; + tin = container_of(td, struct ctf_trace, parent); + + *list = (struct bt_ctf_event_decl const* const*) tin->event_declarations->pdata; + *count = tin->event_declarations->len; + return 0; + +error: + return -1; +} + +const char *bt_ctf_get_decl_event_name(const struct bt_ctf_event_decl *event) +{ + if (!event) + return NULL; + return g_quark_to_string(event->parent.name); +} diff --git a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c index 4b399613..9ded7162 100644 --- a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c +++ b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "ctf-scanner.h" #include "ctf-parser.h" #include "ctf-ast.h" @@ -1742,8 +1743,10 @@ int ctf_event_visit(FILE *fd, int depth, struct ctf_node *node, int ret = 0; struct ctf_node *iter; struct ctf_event_declaration *event; + struct bt_ctf_event_decl *event_decl; - event = g_new0(struct ctf_event_declaration, 1); + event_decl = g_new0(struct bt_ctf_event_decl, 1); + event = &event_decl->parent; event->declaration_scope = new_declaration_scope(parent_declaration_scope); event->loglevel = -1; bt_list_for_each_entry(iter, &node->u.event.declaration_list, siblings) { @@ -1787,6 +1790,7 @@ int ctf_event_visit(FILE *fd, int depth, struct ctf_node *node, g_hash_table_insert(event->stream->event_quark_to_id, (gpointer) (unsigned long) event->name, &event->id); + g_ptr_array_add(trace->event_declarations, event_decl); return 0; error: @@ -1795,7 +1799,7 @@ error: if (event->context_decl) declaration_unref(&event->context_decl->p); free_declaration_scope(event->declaration_scope); - g_free(event); + g_free(event_decl); return ret; } @@ -2128,6 +2132,7 @@ int ctf_trace_visit(FILE *fd, int depth, struct ctf_node *node, struct ctf_trace return -EEXIST; trace->declaration_scope = new_declaration_scope(trace->root_declaration_scope); trace->streams = g_ptr_array_new(); + trace->event_declarations = g_ptr_array_new(); bt_list_for_each_entry(iter, &node->u.trace.declaration_list, siblings) { ret = ctf_trace_declaration_visit(fd, depth + 1, iter, trace); if (ret) @@ -2166,6 +2171,7 @@ error: trace->packet_header_decl = NULL; } g_ptr_array_free(trace->streams, TRUE); + g_ptr_array_free(trace->event_declarations, TRUE); free_declaration_scope(trace->declaration_scope); trace->declaration_scope = NULL; return ret; diff --git a/include/babeltrace/ctf-ir/metadata.h b/include/babeltrace/ctf-ir/metadata.h index 7f2b06d6..c18749f7 100644 --- a/include/babeltrace/ctf-ir/metadata.h +++ b/include/babeltrace/ctf-ir/metadata.h @@ -140,6 +140,7 @@ struct ctf_trace { GHashTable *clocks; struct ctf_clock *single_clock; /* currently supports only one clock */ struct trace_collection *collection; /* Container of this trace */ + GPtrArray *event_declarations; /* Array of all the struct bt_ctf_event_decl */ struct declaration_struct *packet_header_decl; diff --git a/include/babeltrace/ctf/events-internal.h b/include/babeltrace/ctf/events-internal.h index b01fda4b..56b7e6b9 100644 --- a/include/babeltrace/ctf/events-internal.h +++ b/include/babeltrace/ctf/events-internal.h @@ -39,7 +39,7 @@ struct bt_ctf_event { }; struct bt_ctf_event_decl { - struct ctf_event_declaration *parent; + struct ctf_event_declaration parent; }; struct bt_ctf_iter { diff --git a/include/babeltrace/ctf/events.h b/include/babeltrace/ctf/events.h index 80fbdcf2..73e6bc1a 100644 --- a/include/babeltrace/ctf/events.h +++ b/include/babeltrace/ctf/events.h @@ -24,9 +24,11 @@ */ #include +#include struct definition; struct bt_ctf_event; +struct bt_ctf_event_decl; /* * the top-level scopes in CTF @@ -186,4 +188,19 @@ char *bt_ctf_get_string(const struct definition *field); */ int bt_ctf_field_get_error(void); +/* + * bt_ctf_get_event_decl_list: set list pointer to an array of bt_ctf_event_decl + * pointers and set count to the number of elements in the array. + * + * Return 0 on success and a negative value on error. + */ +int bt_ctf_get_event_decl_list(int handle_id, struct bt_context *ctx, + struct bt_ctf_event_decl const * const **list, + unsigned int *count); + +/* + * bt_ctf_get_decl_event_name: return the name of the event or NULL on error + */ +const char *bt_ctf_get_decl_event_name(const struct bt_ctf_event_decl *event); + #endif /* _BABELTRACE_CTF_EVENTS_H */ -- 2.34.1