Correct syntax, not done but release often they say :-(
[lttv.git] / ltt / branches / poly / lttv / textDump.c
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
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>
12 #include <ltt/ltt.h>
13 #include <ltt/event.h>
14 #include <ltt/type.h>
15 #include <ltt/trace.h>
16 #include <stdio.h>
17
18 static gboolean
19 a_field_names,
20 a_state;
21
22 static char
23 *a_file_name;
24
25 static LttvHooks
26 *before_traceset,
27 *after_traceset,
28 *before_trace,
29 *before_event;
30
31
32 void print_field(LttEvent *e, LttField *f, GString *s, gboolean field_names) {
33
34 LttType *type;
35
36 LttField *element;
37
38 char *name;
39
40 int nb, i;
41
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;
47
48 case LTT_UINT:
49 g_string_append_printf(s, " %lu", ltt_event_get_long_unsigned(e,f));
50 break;
51
52 case LTT_FLOAT:
53 g_string_append_printf(s, " %g", ltt_event_get_double(e,f));
54 break;
55
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,
62 event_get_unsigned(e,f)));
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);
82 if(name) {
83 ltt_type_member_type(type, i, &name);
84 g_string_append_printf(s, " %s = ", field_names);
85 }
86 print_field(e, element, s, field_names);
87 }
88 g_string_append_printf(s, " }");
89 break;
90 }
91 }
92
93
94 void lttv_event_to_string(LttEvent *e, LttTracefile *tf, GString *s,
95 gboolean mandatory_fields, gboolean field_names)
96 {
97 LttFacility *facility;
98
99 LttEventType *event_type;
100
101 LttType *type;
102
103 LttField *field;
104
105 LttTime time;
106
107 g_string_set_size(s,0);
108
109 facility = ltt_event_facility(e);
110 event_type = ltt_event_eventtype(e);
111 field = ltt_event_field(e);
112
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));
118 }
119
120 print_field(e, field, s, field_names);
121 }
122
123
124 /* Insert the hooks before and after each trace and tracefile, and for each
125 event. Print a global header. */
126
127 static FILE *a_file;
128
129 static GString *a_string;
130
131 static gboolean write_traceset_header(void *hook_data, void *call_data)
132 {
133 LttvTracesetContext *tc = (LttvTracesetContext *)call_data;
134
135 if(a_file_name == NULL) a_file = stdout;
136 else a_file = fopen(a_file_name, "w");
137
138 if(a_file == NULL) g_error("cannot open file %s", a_file_name);
139
140 /* Print the trace set header */
141 fprintf(a_file,"Trace set contains %d traces\n\n",
142 lttv_traceset_number(tc->ts));
143
144 return FALSE;
145 }
146
147
148 static gboolean write_traceset_footer(void *hook_data, void *call_data)
149 {
150 LttvTracesetContext *tc = (LttvTracesetContext *)call_data;
151
152 fprintf(a_file,"End trace set\n\n");
153
154 if(a_file_name != NULL) fclose(a_file);
155
156 return FALSE;
157 }
158
159
160 static gboolean write_trace_header(void *hook_data, void *call_data)
161 {
162 LttvTraceContext *tc = (LttvTraceContext *)call_data;
163
164 LttSystemDescription *system = ltt_trace_system_description(tc->t);
165
166 fprintf(a_file," Trace from %s in %s\n%s\n\n", system->node_name,
167 system->domain_name, system->description);
168 return FALSE;
169 }
170
171
172 static int write_event_content(void *hook_data, void *call_data)
173 {
174 LttvTracefileContext *tfc = (LttvTracefileContext *)call_data;
175
176 LttvTracefileState *tfs = (LttvTracefileState *)call_data;
177
178 LttEvent *e;
179
180 e = tfc->e;
181
182 lttv_event_to_string(e, tfc->tf, a_string, TRUE, a_field_names);
183
184 if(a_state) {
185 g_string_append_printf(a_string, " %s",
186 g_quark_to_string(tfs->process->state->s));
187 }
188
189 fputs(a_string->str, a_file);
190 return FALSE;
191 }
192
193
194 void init(int argc, char **argv)
195 {
196 LttvAttributeValue value;
197
198 LttvIAttribute *attributes = LTTV_IATTRIBUTE(lttv_global_attributes());
199
200 a_file_name = NULL;
201 lttv_option_add("output", 'o',
202 "output file where the text is written",
203 "file name",
204 LTTV_OPT_STRING, &a_file_name, NULL, NULL);
205
206 a_field_names = FALSE;
207 lttv_option_add("field_names", 'l',
208 "write the field names for each event",
209 "",
210 LTTV_OPT_NONE, &a_field_names, NULL, NULL);
211
212 a_state = FALSE;
213 lttv_option_add("process_state", 's',
214 "write the pid and state for each event",
215 "",
216 LTTV_OPT_NONE, &a_state, NULL, NULL);
217
218 g_assert(lttv_iattribute_find_by_path(attributes, "hooks/event/before",
219 LTTV_POINTER, &value));
220 g_assert((before_event = *(value.v_pointer)) != NULL);
221 lttv_hooks_add(before_event, write_event_content, NULL);
222
223 g_assert(lttv_iattribute_find_by_path(attributes, "hooks/trace/before",
224 LTTV_POINTER, &value));
225 g_assert((before_trace = *(value.v_pointer)) != NULL);
226 lttv_hooks_add(before_trace, write_trace_header, NULL);
227
228 g_assert(lttv_iattribute_find_by_path(attributes, "hooks/traceset/before",
229 LTTV_POINTER, &value));
230 g_assert((before_traceset = *(value.v_pointer)) != NULL);
231 lttv_hooks_add(before_traceset, write_traceset_header, NULL);
232
233 g_assert(lttv_iattribute_find_by_path(attributes, "hooks/traceset/after",
234 LTTV_POINTER, &value));
235 g_assert((after_traceset = *(value.v_pointer)) != NULL);
236 lttv_hooks_add(after_traceset, write_traceset_footer, NULL);
237 }
238
239
240 void destroy()
241 {
242 lttv_option_remove("output");
243
244 lttv_option_remove("field_names");
245
246 lttv_option_remove("process_state");
247
248 lttv_hooks_remove_data(before_event, write_event_content, NULL);
249
250 lttv_hooks_remove_data(before_trace, write_trace_header, NULL);
251
252 lttv_hooks_remove_data(before_trace, write_traceset_header, NULL);
253
254 lttv_hooks_remove_data(before_trace, write_traceset_footer, NULL);
255 }
256
257
258
259
This page took 0.034548 seconds and 4 git commands to generate.