required module for textDump : batchAnalysis
[lttv.git] / ltt / branches / poly / lttv / textDump.c
CommitLineData
48f6f3c2 1/* The text dump facility needs to print headers before the trace set and
2 before each trace, to print each event, and to print statistics
3 after each trace. */
4
996acd92 5#include <lttv/lttv.h>
6#include <lttv/option.h>
7#include <lttv/module.h>
8#include <lttv/hook.h>
9#include <lttv/attribute.h>
10#include <lttv/iattribute.h>
11#include <lttv/state.h>
ffd54a90 12#include <ltt/ltt.h>
13#include <ltt/event.h>
14#include <ltt/type.h>
15#include <ltt/trace.h>
16#include <stdio.h>
996acd92 17
dc877563 18static gboolean
19 a_field_names,
20 a_state;
21
22static char
23 *a_file_name;
24
25static LttvHooks
26 *before_traceset,
27 *after_traceset,
28 *before_trace,
29 *before_event;
30
f60d7a47 31
ffd54a90 32void print_field(LttEvent *e, LttField *f, GString *s, gboolean field_names) {
dc877563 33
ffd54a90 34 LttType *type;
dc877563 35
ffd54a90 36 LttField *element;
dc877563 37
ffd54a90 38 char *name;
dc877563 39
ffd54a90 40 int nb, i;
dc877563 41
ffd54a90 42 type = ltt_field_type(f);
43 switch(ltt_type_class(type)) {
44 case LTT_INT:
45 g_string_append_printf(s, " %ld", ltt_event_get_long_int(e,f));
46 break;
dc877563 47
ffd54a90 48 case LTT_UINT:
49 g_string_append_printf(s, " %lu", ltt_event_get_long_unsigned(e,f));
50 break;
dc877563 51
ffd54a90 52 case LTT_FLOAT:
53 g_string_append_printf(s, " %g", ltt_event_get_double(e,f));
54 break;
dc877563 55
ffd54a90 56 case LTT_STRING:
57 g_string_append_printf(s, " \"%s\"", ltt_event_get_string(e,f));
58 break;
59
60 case LTT_ENUM:
61 g_string_append_printf(s, " %s", ltt_enum_string_get(type,
c6bc9cb9 62 ltt_event_get_unsigned(e,f)-1));
ffd54a90 63 break;
64
65 case LTT_ARRAY:
66 case LTT_SEQUENCE:
67 g_string_append_printf(s, " {");
68 nb = ltt_event_field_element_number(e,f);
69 element = ltt_field_element(f);
70 for(i = 0 ; i < nb ; i++) {
71 ltt_event_field_element_select(e,f,i);
72 print_field(e, element, s, field_names);
73 }
74 g_string_append_printf(s, " }");
75 break;
76
77 case LTT_STRUCT:
78 g_string_append_printf(s, " {");
79 nb = ltt_type_member_number(type);
80 for(i = 0 ; i < nb ; i++) {
81 element = ltt_field_member(f,i);
c432246e 82 if(field_names) {
ffd54a90 83 ltt_type_member_type(type, i, &name);
c432246e 84 g_string_append_printf(s, " %s = ", name);
ffd54a90 85 }
86 print_field(e, element, s, field_names);
87 }
88 g_string_append_printf(s, " }");
89 break;
90 }
48f6f3c2 91}
92
93
ffd54a90 94void lttv_event_to_string(LttEvent *e, LttTracefile *tf, GString *s,
3d27549e 95 gboolean mandatory_fields, gboolean field_names, LttvTracefileState *tfs)
96{
ffd54a90 97 LttFacility *facility;
48f6f3c2 98
ffd54a90 99 LttEventType *event_type;
48f6f3c2 100
ffd54a90 101 LttType *type;
102
103 LttField *field;
48f6f3c2 104
ffd54a90 105 LttTime time;
48f6f3c2 106
ffd54a90 107 g_string_set_size(s,0);
dc877563 108
ffd54a90 109 facility = ltt_event_facility(e);
110 event_type = ltt_event_eventtype(e);
111 field = ltt_event_field(e);
48f6f3c2 112
ffd54a90 113 if(mandatory_fields) {
114 time = ltt_event_time(e);
115 g_string_append_printf(s,"%s.%s: %ld.%ld (%s)",ltt_facility_name(facility),
116 ltt_eventtype_name(event_type), (long)time.tv_sec, time.tv_nsec,
117 ltt_tracefile_name(tf));
c432246e 118 /* Print the process id and the state/interrupt type of the process */
3d27549e 119 g_string_append_printf(s,", %d, %s", tfs->process->pid,
120 g_quark_to_string(tfs->process->state->t));
ffd54a90 121 }
122
c6bc9cb9 123 if(field)
124 print_field(e, field, s, field_names);
ffd54a90 125}
48f6f3c2 126
127
dc877563 128/* Insert the hooks before and after each trace and tracefile, and for each
129 event. Print a global header. */
130
131static FILE *a_file;
48f6f3c2 132
dc877563 133static GString *a_string;
134
ffd54a90 135static gboolean write_traceset_header(void *hook_data, void *call_data)
48f6f3c2 136{
dc877563 137 LttvTracesetContext *tc = (LttvTracesetContext *)call_data;
48f6f3c2 138
dc877563 139 if(a_file_name == NULL) a_file = stdout;
140 else a_file = fopen(a_file_name, "w");
48f6f3c2 141
dc877563 142 if(a_file == NULL) g_error("cannot open file %s", a_file_name);
48f6f3c2 143
dc877563 144 /* Print the trace set header */
145 fprintf(a_file,"Trace set contains %d traces\n\n",
ffd54a90 146 lttv_traceset_number(tc->ts));
48f6f3c2 147
dc877563 148 return FALSE;
48f6f3c2 149}
150
151
ffd54a90 152static gboolean write_traceset_footer(void *hook_data, void *call_data)
48f6f3c2 153{
dc877563 154 LttvTracesetContext *tc = (LttvTracesetContext *)call_data;
48f6f3c2 155
dc877563 156 fprintf(a_file,"End trace set\n\n");
48f6f3c2 157
ffd54a90 158 if(a_file_name != NULL) fclose(a_file);
159
dc877563 160 return FALSE;
48f6f3c2 161}
162
163
dc877563 164static gboolean write_trace_header(void *hook_data, void *call_data)
48f6f3c2 165{
dc877563 166 LttvTraceContext *tc = (LttvTraceContext *)call_data;
167
168 LttSystemDescription *system = ltt_trace_system_description(tc->t);
48f6f3c2 169
dc877563 170 fprintf(a_file," Trace from %s in %s\n%s\n\n", system->node_name,
171 system->domain_name, system->description);
172 return FALSE;
48f6f3c2 173}
174
175
dc877563 176static int write_event_content(void *hook_data, void *call_data)
48f6f3c2 177{
dc877563 178 LttvTracefileContext *tfc = (LttvTracefileContext *)call_data;
48f6f3c2 179
dc877563 180 LttvTracefileState *tfs = (LttvTracefileState *)call_data;
48f6f3c2 181
dc877563 182 LttEvent *e;
48f6f3c2 183
dc877563 184 e = tfc->e;
48f6f3c2 185
3d27549e 186 lttv_event_to_string(e, tfc->tf, a_string, TRUE, a_field_names, tfs);
c6bc9cb9 187 g_string_append_printf(a_string,"\n");
dc877563 188
189 if(a_state) {
190 g_string_append_printf(a_string, " %s",
ffd54a90 191 g_quark_to_string(tfs->process->state->s));
dc877563 192 }
48f6f3c2 193
ffd54a90 194 fputs(a_string->str, a_file);
dc877563 195 return FALSE;
48f6f3c2 196}
197
198
d83f6739 199G_MODULE_EXPORT void init(LttvModule *self, int argc, char **argv)
48f6f3c2 200{
ffd54a90 201 LttvAttributeValue value;
48f6f3c2 202
ffd54a90 203 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
48f6f3c2 204
9402662d 205 LttvModule *batchAnalysis =
206 lttv_module_require(self, "batchAnalysis", argc, argv);
207
208 if(batchAnalysis == NULL)
209 {
210 g_error("Can't load required module batchAnalysis");
211 return;
212 }
213
214
c6bc9cb9 215 a_string = g_string_new("");
216
ffd54a90 217 a_file_name = NULL;
218 lttv_option_add("output", 'o',
219 "output file where the text is written",
220 "file name",
221 LTTV_OPT_STRING, &a_file_name, NULL, NULL);
48f6f3c2 222
ffd54a90 223 a_field_names = FALSE;
224 lttv_option_add("field_names", 'l',
225 "write the field names for each event",
226 "",
227 LTTV_OPT_NONE, &a_field_names, NULL, NULL);
48f6f3c2 228
ffd54a90 229 a_state = FALSE;
230 lttv_option_add("process_state", 's',
231 "write the pid and state for each event",
232 "",
233 LTTV_OPT_NONE, &a_state, NULL, NULL);
dc877563 234
ffd54a90 235 g_assert(lttv_iattribute_find_by_path(attributes, "hooks/event/before",
236 LTTV_POINTER, &value));
237 g_assert((before_event = *(value.v_pointer)) != NULL);
238 lttv_hooks_add(before_event, write_event_content, NULL);
dc877563 239
ffd54a90 240 g_assert(lttv_iattribute_find_by_path(attributes, "hooks/trace/before",
241 LTTV_POINTER, &value));
242 g_assert((before_trace = *(value.v_pointer)) != NULL);
243 lttv_hooks_add(before_trace, write_trace_header, NULL);
dc877563 244
ffd54a90 245 g_assert(lttv_iattribute_find_by_path(attributes, "hooks/traceset/before",
246 LTTV_POINTER, &value));
247 g_assert((before_traceset = *(value.v_pointer)) != NULL);
248 lttv_hooks_add(before_traceset, write_traceset_header, NULL);
dc877563 249
ffd54a90 250 g_assert(lttv_iattribute_find_by_path(attributes, "hooks/traceset/after",
251 LTTV_POINTER, &value));
252 g_assert((after_traceset = *(value.v_pointer)) != NULL);
253 lttv_hooks_add(after_traceset, write_traceset_footer, NULL);
254}
48f6f3c2 255
48f6f3c2 256
d83f6739 257G_MODULE_EXPORT void destroy()
ffd54a90 258{
259 lttv_option_remove("output");
48f6f3c2 260
ffd54a90 261 lttv_option_remove("field_names");
48f6f3c2 262
ffd54a90 263 lttv_option_remove("process_state");
48f6f3c2 264
c6bc9cb9 265 g_string_free(a_string, TRUE);
266
ffd54a90 267 lttv_hooks_remove_data(before_event, write_event_content, NULL);
48f6f3c2 268
ffd54a90 269 lttv_hooks_remove_data(before_trace, write_trace_header, NULL);
48f6f3c2 270
ffd54a90 271 lttv_hooks_remove_data(before_trace, write_traceset_header, NULL);
48f6f3c2 272
ffd54a90 273 lttv_hooks_remove_data(before_trace, write_traceset_footer, NULL);
48f6f3c2 274}
275
276
277
278
This page took 0.038194 seconds and 4 git commands to generate.