X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodules%2Ftext%2FtextDump.c;h=ded3c89744c3b3402c9e1ad6ee81e20dca80bd9e;hb=1da1525dc4a987ee97bd025f96d2ee75804d2012;hp=24b266a285212c2366df8e8ddef7e2ee9ae8d93c;hpb=fcdf74b2f0f101853545898193bcc2f6eb02c85d;p=lttv.git diff --git a/ltt/branches/poly/lttv/modules/text/textDump.c b/ltt/branches/poly/lttv/modules/text/textDump.c index 24b266a2..ded3c897 100644 --- a/ltt/branches/poly/lttv/modules/text/textDump.c +++ b/ltt/branches/poly/lttv/modules/text/textDump.c @@ -1,3 +1,21 @@ +/* This file is part of the Linux Trace Toolkit viewer + * Copyright (C) 2003-2004 Michel Dagenais + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License Version 2 as + * published by the Free Software Foundation; + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + */ + /* The text dump facility needs to print headers before the trace set and before each trace, to print each event, and to print statistics after each trace. */ @@ -13,6 +31,7 @@ #include #include #include +#include #include static gboolean @@ -28,7 +47,7 @@ static LttvHooks *before_traceset, *after_traceset, *before_trace, - *before_event; + *event_hook; void print_field(LttEvent *e, LttField *f, GString *s, gboolean field_names) { @@ -44,11 +63,11 @@ void print_field(LttEvent *e, LttField *f, GString *s, gboolean field_names) { type = ltt_field_type(f); switch(ltt_type_class(type)) { case LTT_INT: - g_string_append_printf(s, " %ld", ltt_event_get_long_int(e,f)); + g_string_append_printf(s, " %lld", ltt_event_get_long_int(e,f)); break; case LTT_UINT: - g_string_append_printf(s, " %lu", ltt_event_get_long_unsigned(e,f)); + g_string_append_printf(s, " %llu", ltt_event_get_long_unsigned(e,f)); break; case LTT_FLOAT: @@ -89,11 +108,26 @@ void print_field(LttEvent *e, LttField *f, GString *s, gboolean field_names) { } g_string_append_printf(s, " }"); break; + + case LTT_UNION: + g_string_append_printf(s, " {"); + nb = ltt_type_member_number(type); + for(i = 0 ; i < nb ; i++) { + element = ltt_field_member(f,i); + if(field_names) { + ltt_type_member_type(type, i, &name); + g_string_append_printf(s, " %s = ", name); + } + print_field(e, element, s, field_names); + } + g_string_append_printf(s, " }"); + break; + } } -void lttv_event_to_string(LttEvent *e, LttTracefile *tf, GString *s, +void lttv_event_to_string(LttEvent *e, GString *s, gboolean mandatory_fields, gboolean field_names, LttvTracefileState *tfs) { LttFacility *facility; @@ -167,7 +201,7 @@ print_tree(FILE *fp, GString *indent, LttvAttribute *tree) fprintf(fp, "%f\n", *value.v_double); break; case LTTV_TIME: - fprintf(fp, "%10u.%09u\n", value.v_time->tv_sec, + fprintf(fp, "%10lu.%09lu\n", value.v_time->tv_sec, value.v_time->tv_nsec); break; case LTTV_POINTER: @@ -218,9 +252,11 @@ print_stats(FILE *fp, LttvTracesetStats *tscs) for(i = 0 ; i < nb ; i++) { tcs = (LttvTraceStats *)(LTTV_TRACESET_CONTEXT(tscs)->traces[i]); desc = ltt_trace_system_description(tcs->parent.parent.t); - fprintf(fp, "Trace on system %s at time %d secs:\n", + LttTime start_time = ltt_trace_system_description_trace_start_time(desc); + fprintf(fp, "Trace on system %s at time %lu.%09lu :\n", ltt_trace_system_description_node_name(desc), - (ltt_trace_system_description_trace_start_time(desc)).tv_sec); + start_time.tv_sec, + start_time.tv_nsec); saved_length = indent->len; g_string_append(indent, " "); print_tree(fp, indent, tcs->stats); @@ -265,6 +301,7 @@ static gboolean write_traceset_footer(void *hook_data, void *call_data) fprintf(a_file,"End trace set\n\n"); if(LTTV_IS_TRACESET_STATS(tc)) { + lttv_stats_sum_traceset((LttvTracesetStats *)tc); print_stats(a_file, (LttvTracesetStats *)tc); } @@ -298,7 +335,7 @@ static int write_event_content(void *hook_data, void *call_data) e = tfc->e; - lttv_event_to_string(e, tfc->tf, a_string, TRUE, a_field_names, tfs); + lttv_event_to_string(e, a_string, TRUE, a_field_names, tfs); g_string_append_printf(a_string,"\n"); if(a_state) { @@ -311,7 +348,7 @@ static int write_event_content(void *hook_data, void *call_data) } -G_MODULE_EXPORT void init(LttvModule *self, int argc, char **argv) +static void init() { LttvAttributeValue value; @@ -319,8 +356,6 @@ G_MODULE_EXPORT void init(LttvModule *self, int argc, char **argv) g_info("Init textDump.c"); - lttv_module_require(self, "libbatchAnalysis", argc, argv); - a_string = g_string_new(""); a_file_name = NULL; @@ -353,29 +388,31 @@ G_MODULE_EXPORT void init(LttvModule *self, int argc, char **argv) "", LTTV_OPT_NONE, &a_process_stats, NULL, NULL); - g_assert(lttv_iattribute_find_by_path(attributes, "hooks/event/before", + g_assert(lttv_iattribute_find_by_path(attributes, "hooks/event", LTTV_POINTER, &value)); - g_assert((before_event = *(value.v_pointer)) != NULL); - lttv_hooks_add(before_event, write_event_content, NULL); + g_assert((event_hook = *(value.v_pointer)) != NULL); + lttv_hooks_add(event_hook, write_event_content, NULL, LTTV_PRIO_DEFAULT); g_assert(lttv_iattribute_find_by_path(attributes, "hooks/trace/before", LTTV_POINTER, &value)); g_assert((before_trace = *(value.v_pointer)) != NULL); - lttv_hooks_add(before_trace, write_trace_header, NULL); + lttv_hooks_add(before_trace, write_trace_header, NULL, LTTV_PRIO_DEFAULT); g_assert(lttv_iattribute_find_by_path(attributes, "hooks/traceset/before", LTTV_POINTER, &value)); g_assert((before_traceset = *(value.v_pointer)) != NULL); - lttv_hooks_add(before_traceset, write_traceset_header, NULL); + lttv_hooks_add(before_traceset, write_traceset_header, NULL, + LTTV_PRIO_DEFAULT); g_assert(lttv_iattribute_find_by_path(attributes, "hooks/traceset/after", LTTV_POINTER, &value)); g_assert((after_traceset = *(value.v_pointer)) != NULL); - lttv_hooks_add(after_traceset, write_traceset_footer, NULL); + lttv_hooks_add(after_traceset, write_traceset_footer, NULL, + LTTV_PRIO_DEFAULT); } -G_MODULE_EXPORT void destroy() +static void destroy() { g_info("Destroy textDump"); @@ -391,7 +428,7 @@ G_MODULE_EXPORT void destroy() g_string_free(a_string, TRUE); - lttv_hooks_remove_data(before_event, write_event_content, NULL); + lttv_hooks_remove_data(event_hook, write_event_content, NULL); lttv_hooks_remove_data(before_trace, write_trace_header, NULL); @@ -401,5 +438,7 @@ G_MODULE_EXPORT void destroy() } - +LTTV_MODULE("textDump", "Print events in a file", \ + "Produce a detailed text printout of a trace", \ + init, destroy, "stats", "batchAnalysis", "option")