From 8e680509351245867a89f5647c7b926af7652f17 Mon Sep 17 00:00:00 2001 From: compudj Date: Wed, 31 Aug 2005 21:08:52 +0000 Subject: [PATCH] put print fields in print.c git-svn-id: http://ltt.polymtl.ca/svn@1101 04897980-b3bd-0310-b5e0-8ef037075253 --- ltt/branches/poly/lttv/lttv/Makefile.am | 5 +- ltt/branches/poly/lttv/lttv/print.c | 184 ++++++++++++++++++ ltt/branches/poly/lttv/lttv/print.h | 34 ++++ .../lttv/modules/gui/controlflow/eventhooks.c | 7 +- .../gui/lttvwindow/lttvwindow/callbacks.c | 2 +- .../lttvwindow/lttvwindow/lttvwindowtraces.c | 16 +- .../poly/lttv/modules/text/batchAnalysis.c | 2 - .../poly/lttv/modules/text/textDump.c | 134 +------------ 8 files changed, 244 insertions(+), 140 deletions(-) create mode 100644 ltt/branches/poly/lttv/lttv/print.c create mode 100644 ltt/branches/poly/lttv/lttv/print.h diff --git a/ltt/branches/poly/lttv/lttv/Makefile.am b/ltt/branches/poly/lttv/lttv/Makefile.am index f5418040..fb7e1329 100644 --- a/ltt/branches/poly/lttv/lttv/Makefile.am +++ b/ltt/branches/poly/lttv/lttv/Makefile.am @@ -21,7 +21,8 @@ lttvinclude_HEADERS = \ stats.h\ tracecontext.h\ traceset.h\ - filter.h + filter.h\ + print.h #noinst_HEADERS = \ # filter.h @@ -29,7 +30,7 @@ lttvinclude_HEADERS = \ lttv_SOURCES = batchtest.c main.c module.c option.c \ hook.c attribute.c \ iattribute.c state.c stats.c \ - tracecontext.c traceset.c filter.c + tracecontext.c traceset.c filter.c print.c if LTTVSTATIC lttv_LDFLAGS = -profile -static diff --git a/ltt/branches/poly/lttv/lttv/print.c b/ltt/branches/poly/lttv/lttv/print.c new file mode 100644 index 00000000..10034244 --- /dev/null +++ b/ltt/branches/poly/lttv/lttv/print.c @@ -0,0 +1,184 @@ + +/* This file is part of the Linux Trace Toolkit viewer + * Copyright (C) 2003-2004 Michel Dagenais + * 2005 Mathieu Desnoyers + * + * 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. + */ + +/* print.c + * + * Event printing routines. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +void lttv_print_field(LttEvent *e, LttField *f, GString *s, + gboolean field_names) { + + LttType *type; + + LttField *element; + + GQuark name; + + int nb, i; + + type = ltt_field_type(f); + switch(ltt_type_class(type)) { + case LTT_INT: + case LTT_LONG: + case LTT_SSIZE_T: + g_string_append_printf(s, " %lld", ltt_event_get_long_int(e,f)); + break; + + case LTT_UINT: + case LTT_ULONG: + case LTT_SIZE_T: + case LTT_OFF_T: + g_string_append_printf(s, " %llu", ltt_event_get_long_unsigned(e,f)); + break; + + case LTT_FLOAT: + g_string_append_printf(s, " %g", ltt_event_get_double(e,f)); + break; + + case LTT_POINTER: + g_string_append_printf(s, " 0x%llx", ltt_event_get_long_unsigned(e,f)); + break; + + case LTT_STRING: + g_string_append_printf(s, " \"%s\"", ltt_event_get_string(e,f)); + break; + + case LTT_ENUM: + g_string_append_printf(s, " %s", + g_quark_to_string(ltt_enum_string_get(type, + ltt_event_get_unsigned(e,f)-1))); + break; + + case LTT_ARRAY: + case LTT_SEQUENCE: + g_string_append_printf(s, " {"); + nb = ltt_event_field_element_number(e,f); + element = ltt_field_element(f); + for(i = 0 ; i < nb ; i++) { + ltt_event_field_element_select(e,f,i); + lttv_print_field(e, element, s, field_names); + } + g_string_append_printf(s, " }"); + break; + + case LTT_STRUCT: + 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 = ", g_quark_to_string(name)); + } + lttv_print_field(e, element, s, 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 = ", g_quark_to_string(name)); + } + lttv_print_field(e, element, s, field_names); + } + g_string_append_printf(s, " }"); + break; + + } +} + + +void lttv_event_to_string(LttEvent *e, GString *s, + gboolean mandatory_fields, gboolean field_names, LttvTracefileState *tfs) +{ + LttFacility *facility; + + LttEventType *event_type; + + LttField *field; + + LttTime time; + + guint cpu = ltt_tracefile_num(tfs->parent.tf); + LttvTraceState *ts = (LttvTraceState*)tfs->parent.t_context; + LttvProcessState *process = ts->running_process[cpu]; + + g_string_set_size(s,0); + + facility = ltt_event_facility(e); + event_type = ltt_event_eventtype(e); + field = ltt_event_field(e); + + if(mandatory_fields) { + time = ltt_event_time(e); + g_string_append_printf(s,"%s.%s: %ld.%09ld (%s_%u)", + g_quark_to_string(ltt_facility_name(facility)), + g_quark_to_string(ltt_eventtype_name(event_type)), + (long)time.tv_sec, time.tv_nsec, + g_quark_to_string(ltt_tracefile_name(tfs->parent.tf)), + cpu); + /* Print the process id and the state/interrupt type of the process */ + g_string_append_printf(s,", %u, %u, %s", process->pid, + process->ppid, + g_quark_to_string(process->state->t)); + } + + if(field) + lttv_print_field(e, field, s, field_names); +} + +static void init() +{ +} + +static void destroy() +{ +} + +LTTV_MODULE("print", "Print events", \ + "Produce a detailed text printout of events", \ + init, destroy) + diff --git a/ltt/branches/poly/lttv/lttv/print.h b/ltt/branches/poly/lttv/lttv/print.h new file mode 100644 index 00000000..c21abcd5 --- /dev/null +++ b/ltt/branches/poly/lttv/lttv/print.h @@ -0,0 +1,34 @@ +/* This file is part of the Linux Trace Toolkit viewer + * Copyright (C) 2003-2004 Michel Dagenais + * 2005 Mathieu Desnoyers + * + * 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. + */ + +/* print.c + * + * Event printing routines header. + * + * Use these functions to print textually event fields. + */ + + + +void lttv_print_field(LttEvent *e, LttField *f, GString *s, + gboolean field_names); + +void lttv_event_to_string(LttEvent *e, GString *s, + gboolean mandatory_fields, gboolean field_names, LttvTracefileState *tfs); + diff --git a/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c b/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c index 089cd5e9..cc152eef 100644 --- a/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c +++ b/ltt/branches/poly/lttv/modules/gui/controlflow/eventhooks.c @@ -534,7 +534,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) hashed_process_data = processlist_get_process_data(process_list, pid_in, - process->cpu, + ltt_tracefile_num(tfc->tf), &birth, tfc->t_context->index); if(hashed_process_data == NULL) @@ -546,7 +546,7 @@ int before_schedchange_hook(void *hook_data, void *call_data) processlist_add(process_list, drawing, pid_in, - process->cpu, + ltt_tracefile_num(tfc->tf), process->ppid, &birth, tfc->t_context->index, @@ -668,7 +668,8 @@ int before_schedchange_hook(void *hook_data, void *call_data) &hashed_process_data->next_good_time); } } - } + } else + g_warning("Cannot find pin_in in schedchange %u", pid_in); } return 0; diff --git a/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c b/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c index 564610a1..9d5a5da6 100644 --- a/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c +++ b/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/callbacks.c @@ -1544,7 +1544,7 @@ gboolean lttvwindow_process_pending_requests(Tab *tab) /* 1.1. Use current postition as start position */ if(events_request->start_position != NULL) lttv_traceset_context_position_destroy(events_request->start_position); - events_request->start_position = lttv_traceset_context_position_new(); + events_request->start_position = lttv_traceset_context_position_new(tsc); lttv_traceset_context_position_save(tsc, events_request->start_position); /* 1.2. Remove start time */ diff --git a/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/lttvwindowtraces.c b/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/lttvwindowtraces.c index 26a12705..511c6c93 100644 --- a/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/lttvwindowtraces.c +++ b/ltt/branches/poly/lttv/modules/gui/lttvwindow/lttvwindow/lttvwindowtraces.c @@ -428,6 +428,11 @@ void lttvwindowtraces_background_notify_queue &value)); slist = (GSList**)(value.v_pointer); + g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute), + LTTV_COMPUTATION_TRACESET_CONTEXT, + LTTV_POINTER, + &value)); + LttvTracesetContext *tsc = (LttvTracesetContext*)(value.v_pointer); bg_notify = g_new(BackgroundNotify,1); @@ -435,7 +440,7 @@ void lttvwindowtraces_background_notify_queue bg_notify->trace = trace; bg_notify->notify_time = notify_time; if(notify_position != NULL) { - bg_notify->notify_position = lttv_traceset_context_position_new(); + bg_notify->notify_position = lttv_traceset_context_position_new(tsc); lttv_traceset_context_position_copy(bg_notify->notify_position, notify_position); } else { @@ -477,13 +482,20 @@ void lttvwindowtraces_background_notify_current &value)); slist = (GSList**)(value.v_pointer); + g_assert(lttv_iattribute_find(LTTV_IATTRIBUTE(attribute), + LTTV_COMPUTATION_TRACESET_CONTEXT, + LTTV_POINTER, + &value)); + LttvTracesetContext *tsc = (LttvTracesetContext*)(value.v_pointer); + + bg_notify = g_new(BackgroundNotify,1); bg_notify->owner = owner; bg_notify->trace = trace; bg_notify->notify_time = notify_time; if(notify_position!= NULL) { - bg_notify->notify_position = lttv_traceset_context_position_new(); + bg_notify->notify_position = lttv_traceset_context_position_new(tsc); lttv_traceset_context_position_copy(bg_notify->notify_position, notify_position); } else { diff --git a/ltt/branches/poly/lttv/modules/text/batchAnalysis.c b/ltt/branches/poly/lttv/modules/text/batchAnalysis.c index 80f11d3c..9cd29274 100644 --- a/ltt/branches/poly/lttv/modules/text/batchAnalysis.c +++ b/ltt/branches/poly/lttv/modules/text/batchAnalysis.c @@ -207,7 +207,6 @@ static void init() lttv_hooks_add(main_hooks, process_traceset, NULL, LTTV_PRIO_DEFAULT); } - static void destroy() { guint i, nb; @@ -241,7 +240,6 @@ static void destroy() lttv_traceset_destroy(traceset); } - LTTV_MODULE("batchAnalysis", "Batch processing of a trace", \ "Run through a trace calling all the registered hooks", \ init, destroy, "state", "stats", "option","textFilter") diff --git a/ltt/branches/poly/lttv/modules/text/textDump.c b/ltt/branches/poly/lttv/modules/text/textDump.c index 14ea876f..dbb8ec0f 100644 --- a/ltt/branches/poly/lttv/modules/text/textDump.c +++ b/ltt/branches/poly/lttv/modules/text/textDump.c @@ -1,5 +1,6 @@ /* This file is part of the Linux Trace Toolkit viewer * Copyright (C) 2003-2004 Michel Dagenais + * 2005 Mathieu Desnoyers * * 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 @@ -32,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -54,133 +56,6 @@ static LttvHooks *before_trace, *event_hook; -void print_field(LttEvent *e, LttField *f, GString *s, gboolean field_names) { - - LttType *type; - - LttField *element; - - GQuark name; - - int nb, i; - - type = ltt_field_type(f); - switch(ltt_type_class(type)) { - case LTT_INT: - case LTT_LONG: - case LTT_SSIZE_T: - g_string_append_printf(s, " %lld", ltt_event_get_long_int(e,f)); - break; - - case LTT_UINT: - case LTT_ULONG: - case LTT_SIZE_T: - case LTT_OFF_T: - g_string_append_printf(s, " %llu", ltt_event_get_long_unsigned(e,f)); - break; - - case LTT_FLOAT: - g_string_append_printf(s, " %g", ltt_event_get_double(e,f)); - break; - - case LTT_POINTER: - g_string_append_printf(s, " 0x%llx", ltt_event_get_long_unsigned(e,f)); - break; - - case LTT_STRING: - g_string_append_printf(s, " \"%s\"", ltt_event_get_string(e,f)); - break; - - case LTT_ENUM: - g_string_append_printf(s, " %s", - g_quark_to_string(ltt_enum_string_get(type, - ltt_event_get_unsigned(e,f)-1))); - break; - - case LTT_ARRAY: - case LTT_SEQUENCE: - g_string_append_printf(s, " {"); - nb = ltt_event_field_element_number(e,f); - element = ltt_field_element(f); - for(i = 0 ; i < nb ; i++) { - ltt_event_field_element_select(e,f,i); - print_field(e, element, s, field_names); - } - g_string_append_printf(s, " }"); - break; - - case LTT_STRUCT: - 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 = ", g_quark_to_string(name)); - } - print_field(e, element, s, 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 = ", g_quark_to_string(name)); - } - print_field(e, element, s, field_names); - } - g_string_append_printf(s, " }"); - break; - - } -} - - -void lttv_event_to_string(LttEvent *e, GString *s, - gboolean mandatory_fields, gboolean field_names, LttvTracefileState *tfs) -{ - LttFacility *facility; - - LttEventType *event_type; - - LttType *type; - - LttField *field; - - LttTime time; - - guint cpu = ltt_tracefile_num(tfs->parent.tf); - LttvTraceState *ts = (LttvTraceState*)tfs->parent.t_context; - LttvProcessState *process = ts->running_process[cpu]; - - g_string_set_size(s,0); - - facility = ltt_event_facility(e); - event_type = ltt_event_eventtype(e); - field = ltt_event_field(e); - - if(mandatory_fields) { - time = ltt_event_time(e); - g_string_append_printf(s,"%s.%s: %ld.%09ld (%s)", - g_quark_to_string(ltt_facility_name(facility)), - g_quark_to_string(ltt_eventtype_name(event_type)), - (long)time.tv_sec, time.tv_nsec, - g_quark_to_string(ltt_tracefile_name(tfs->parent.tf))); - /* Print the process id and the state/interrupt type of the process */ - g_string_append_printf(s,", %u, %u, %s", process->pid, - process->ppid, - g_quark_to_string(process->state->t)); - } - - if(field) - print_field(e, field, s, field_names); -} - static void print_tree(FILE *fp, GString *indent, LttvAttribute *tree) @@ -376,7 +251,7 @@ static int write_event_content(void *hook_data, void *call_data) */ if(filter->head != NULL) if(!lttv_filter_tree_parse(filter->head,e,tfc->tf, - tfc->t_context->t,process,tfc)) + tfc->t_context->t,tfc)) return FALSE; lttv_event_to_string(e, a_string, TRUE, a_field_names, tfs); @@ -455,7 +330,6 @@ static void init() LTTV_PRIO_DEFAULT); } - static void destroy() { g_info("Destroy textDump"); @@ -484,5 +358,5 @@ static void destroy() LTTV_MODULE("textDump", "Print events in a file", \ "Produce a detailed text printout of a trace", \ - init, destroy, "stats", "batchAnalysis", "option") + init, destroy, "stats", "batchAnalysis", "option", "print") -- 2.34.1