move ltt-private.h from public directroy into private directroy
[lttv.git] / ltt / branches / poly / ltt / event.c
1 #include <stdio.h>
2 #include <asm/types.h>
3 #include <linux/byteorder/swab.h>
4
5 #include "parser.h"
6 #include <ltt/ltt.h>
7 #include "ltt-private.h"
8 #include <ltt/event.h>
9 #include <ltt/trace.h>
10
11 /*****************************************************************************
12 *Function name
13 * ltt_event_refresh_fields : refresh fields of an event
14 *Input params
15 * offsetRoot : offset from the root
16 * offsetParent : offset from the parrent
17 * fld : field
18 * evD : event data
19 *Return value
20 * int : size of the field
21 ****************************************************************************/
22
23 int ltt_event_refresh_fields(int offsetRoot,int offsetParent,
24 LttField * fld, void *evD)
25 {
26 int size, size1, element_number, i, offset1, offset2;
27 LttType * type = fld->field_type;
28
29 if(type->type_class != LTT_STRUCT && type->type_class != LTT_ARRAY &&
30 type->type_class != LTT_SEQUENCE && type->type_class != LTT_STRING){
31 size = fld->field_size;
32 }else if(type->type_class == LTT_ARRAY){
33 element_number = (int) type->element_number;
34 if(fld->field_fixed == 0){// has string or sequence
35 size = 0;
36 for(i=0;i<element_number;i++){
37 size += ltt_event_refresh_fields(offsetRoot+size,size,
38 fld->child[0], evD+size);
39 }
40 }else size = fld->field_size;
41 }else if(type->type_class == LTT_SEQUENCE){
42 size1 = fld->sequ_number_size;
43 element_number = getIntNumber(size1,evD);
44 type->element_number = element_number;
45 if(fld->element_size > 0){
46 size = element_number * fld->element_size;
47 }else{//sequence has string or sequence
48 size = 0;
49 for(i=0;i<element_number;i++){
50 size += ltt_event_refresh_fields(offsetRoot+size+size1,size+size1,
51 fld->child[0], evD+size+size1);
52 }
53 size += size1;
54 }
55 }else if(type->type_class == LTT_STRING){
56 size = strlen((char*)evD) + 1; //include end : '\0'
57 }else if(type->type_class == LTT_STRUCT){
58 element_number = (int) type->element_number;
59 if(fld->field_fixed == 0){
60 offset1 = offsetRoot;
61 offset2 = 0;
62 for(i=0;i<element_number;i++){
63 size=ltt_event_refresh_fields(offset1,offset2,fld->child[i],evD+offset2);
64 offset1 += size;
65 offset2 += size;
66 }
67 size = offset2;
68 }else size = fld->field_size;
69 }
70
71 fld->offset_root = offsetRoot;
72 fld->offset_parent = offsetParent;
73 fld->fixed_root = (offsetRoot==-1) ? 0 : 1;
74 fld->fixed_parent = (offsetParent==-1) ? 0 : 1;
75 fld->field_size = size;
76
77 return size;
78 }
79
80 /*****************************************************************************
81 *Function name
82 * ltt_event_eventtype_id: get event type id
83 * (base id + position of the event)
84 *Input params
85 * e : an instance of an event type
86 *Return value
87 * unsigned : event type id
88 ****************************************************************************/
89
90 unsigned ltt_event_eventtype_id(LttEvent *e)
91 {
92 return (unsigned) e->event_id;
93 }
94
95 /*****************************************************************************
96 *Function name
97 * ltt_event_facility : get the facility of the event
98 *Input params
99 * e : an instance of an event type
100 *Return value
101 * LttFacility * : the facility of the event
102 ****************************************************************************/
103
104 LttFacility *ltt_event_facility(LttEvent *e)
105 {
106 LttTrace * trace = e->tracefile->trace;
107 unsigned id = e->event_id;
108 return ltt_trace_facility_by_id(trace,id);
109 }
110
111 /*****************************************************************************
112 *Function name
113 * ltt_event_eventtype : get the event type of the event
114 *Input params
115 * e : an instance of an event type
116 *Return value
117 * LttEventType * : the event type of the event
118 ****************************************************************************/
119
120 LttEventType *ltt_event_eventtype(LttEvent *e)
121 {
122 LttFacility* facility = ltt_event_facility(e);
123 if(!facility) return NULL;
124 return facility->events[e->event_id - facility->base_id];
125 }
126
127 /*****************************************************************************
128 *Function name
129 * ltt_event_field : get the root field of the event
130 *Input params
131 * e : an instance of an event type
132 *Return value
133 * LttField * : the root field of the event
134 ****************************************************************************/
135
136 LttField *ltt_event_field(LttEvent *e)
137 {
138 LttField * field;
139 LttEventType * event_type = ltt_event_eventtype(e);
140 if(!event_type) return NULL;
141 field = event_type->root_field;
142 if(!field) return NULL;
143
144 //check if the field need refresh
145 if(e->which_block != event_type->latest_block ||
146 e->which_event != event_type->latest_event){
147
148 event_type->latest_block = e->which_block;
149 event_type->latest_event = e->which_event;
150
151 if(field->field_fixed == 1)return field;
152
153 //refresh the field
154 ltt_event_refresh_fields(0, 0, field, e->data);
155 }
156 return field;
157 }
158
159 /*****************************************************************************
160 *Function name
161 * ltt_event_time : get the time of the event
162 *Input params
163 * e : an instance of an event type
164 *Return value
165 * LttTime : the time of the event
166 ****************************************************************************/
167
168 LttTime ltt_event_time(LttEvent *e)
169 {
170 return e->event_time;
171 }
172
173 /*****************************************************************************
174 *Function name
175 * ltt_event_time : get the cycle count of the event
176 *Input params
177 * e : an instance of an event type
178 *Return value
179 * LttCycleCount : the cycle count of the event
180 ****************************************************************************/
181
182 LttCycleCount ltt_event_cycle_count(LttEvent *e)
183 {
184 return e->event_cycle_count;
185 }
186
187 /*****************************************************************************
188 *Function name
189 * ltt_event_position : get the event's position
190 *Input params
191 * e : an instance of an event type
192 * ep : a pointer to event's position structure
193 ****************************************************************************/
194
195 void ltt_event_position(LttEvent *e, LttEventPosition *ep)
196 {
197 ep->block_num = e->which_block;
198 ep->event_num = e->which_event;
199 ep->event_time = e->event_time;
200 ep->event_cycle_count = e->event_cycle_count;
201 ep->heart_beat_number = e->tracefile->cur_heart_beat_number;
202 ep->old_position = FALSE;
203 ep->event_offset = e->data - e->tracefile->buffer - EVENT_HEADER_SIZE ;
204 ep->tf = e->tracefile;
205 }
206
207 LttEventPosition * ltt_event_position_new()
208 {
209 return g_new(LttEventPosition, 1);
210 }
211
212 /*****************************************************************************
213 *Function name
214 * ltt_event_position_get : get the block number and index of the event
215 *Input params
216 * ep : a pointer to event's position structure
217 * block_number : the block number of the event
218 * index_in_block : the index of the event within the block
219 ****************************************************************************/
220
221 void ltt_event_position_get(LttEventPosition *ep,
222 unsigned *block_number, unsigned *index_in_block, LttTracefile ** tf)
223 {
224 *block_number = ep->block_num;
225 *index_in_block = ep->event_num;
226 *tf = ep->tf;
227 }
228
229 /*****************************************************************************
230 *Function name
231 * ltt_event_position_set : set the block number and index of the event
232 *Input params
233 * ep : a pointer to event's position structure
234 * block_number : the block number of the event
235 * index_in_block : the index of the event within the block
236 ****************************************************************************/
237
238 void ltt_event_position_set(LttEventPosition *ep,
239 unsigned block_number, unsigned index_in_block)
240 {
241 ep->block_num = block_number;
242 ep->event_num = index_in_block;
243 }
244
245 /*****************************************************************************
246 *Function name
247 * ltt_event_cpu_i: get the cpu id where the event happens
248 *Input params
249 * e : an instance of an event type
250 *Return value
251 * unsigned : the cpu id
252 ****************************************************************************/
253
254 unsigned ltt_event_cpu_id(LttEvent *e)
255 {
256 return (unsigned)atoi(e->tracefile->name);
257 }
258
259 /*****************************************************************************
260 *Function name
261 * ltt_event_data : get the raw data for the event
262 *Input params
263 * e : an instance of an event type
264 *Return value
265 * void * : pointer to the raw data for the event
266 ****************************************************************************/
267
268 void *ltt_event_data(LttEvent *e)
269 {
270 return e->data;
271 }
272
273 /*****************************************************************************
274 *Function name
275 * ltt_event_field_element_number
276 * : The number of elements in a sequence field is specific
277 * to each event. This function returns the number of
278 * elements for an array or sequence field in an event.
279 *Input params
280 * e : an instance of an event type
281 * f : a field of the instance
282 *Return value
283 * unsigned : the number of elements for an array/sequence field
284 ****************************************************************************/
285
286 unsigned ltt_event_field_element_number(LttEvent *e, LttField *f)
287 {
288 if(f->field_type->type_class != LTT_ARRAY &&
289 f->field_type->type_class != LTT_SEQUENCE)
290 return 0;
291
292 if(f->field_type->type_class == LTT_ARRAY)
293 return f->field_type->element_number;
294 return (unsigned) getIntNumber(f->sequ_number_size, e + f->offset_root);
295 }
296
297 /*****************************************************************************
298 *Function name
299 * ltt_event_field_element_select
300 * : Set the currently selected element for a sequence or
301 * array field
302 *Input params
303 * e : an instance of an event type
304 * f : a field of the instance
305 * i : the ith element
306 ****************************************************************************/
307
308 void ltt_event_field_element_select(LttEvent *e, LttField *f, unsigned i)
309 {
310 unsigned element_number;
311 LttField *fld;
312 int k, size;
313 void *evD;
314
315 if(f->field_type->type_class != LTT_ARRAY &&
316 f->field_type->type_class != LTT_SEQUENCE)
317 return ;
318
319 element_number = ltt_event_field_element_number(e,f);
320 if((element_number-1) < i || i < 0) return;
321
322 fld = f->child[0];
323
324 evD = e->data + f->offset_root;
325 size = 0;
326 for(k=0;k<i;k++){
327 size += ltt_event_refresh_fields(f->offset_root+size,size, fld, evD+size);
328 }
329
330 f->current_element = i - 1;
331 }
332
333 /*****************************************************************************
334 * These functions extract data from an event after architecture specific
335 * conversions
336 ****************************************************************************/
337
338 unsigned ltt_event_get_unsigned(LttEvent *e, LttField *f)
339 {
340 int revFlag = e->tracefile->trace->my_arch_endian ==
341 e->tracefile->trace->system_description->endian ? 0:1;
342 LttTypeEnum t = f->field_type->type_class;
343
344 if(t != LTT_UINT && t != LTT_ENUM)
345 g_error("The type of the field is not unsigned int\n");
346
347 if(f->field_size == 1){
348 guint8 x = *(guint8 *)(e->data + f->offset_root);
349 return (unsigned int) x;
350 }else if(f->field_size == 2){
351 guint16 x = *(guint16 *)(e->data + f->offset_root);
352 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
353 return (unsigned int) (revFlag ? GUINT16_FROM_BE(x): x);
354 else
355 return (unsigned int) (revFlag ? GUINT16_FROM_LE(x): x);
356 }else if(f->field_size == 4){
357 guint32 x = *(guint32 *)(e->data + f->offset_root);
358 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
359 return (unsigned int) (revFlag ? GUINT32_FROM_BE(x): x);
360 else
361 return (unsigned int) (revFlag ? GUINT32_FROM_LE(x): x);
362 }else if(f->field_size == 8){
363 guint64 x = *(guint64 *)(e->data + f->offset_root);
364 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
365 return (unsigned int) (revFlag ? GUINT64_FROM_BE(x): x);
366 else
367 return (unsigned int) (revFlag ? GUINT64_FROM_LE(x): x);
368 }
369 }
370
371 int ltt_event_get_int(LttEvent *e, LttField *f)
372 {
373 int revFlag = e->tracefile->trace->my_arch_endian ==
374 e->tracefile->trace->system_description->endian ? 0:1;
375
376 if(f->field_type->type_class != LTT_INT)
377 g_error("The type of the field is not int\n");
378
379 if(f->field_size == 1){
380 gint8 x = *(gint8 *)(e->data + f->offset_root);
381 return (int) x;
382 }else if(f->field_size == 2){
383 gint16 x = *(gint16 *)(e->data + f->offset_root);
384 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
385 return (int) (revFlag ? GINT16_FROM_BE(x): x);
386 else
387 return (int) (revFlag ? GINT16_FROM_LE(x): x);
388 }else if(f->field_size == 4){
389 gint32 x = *(gint32 *)(e->data + f->offset_root);
390 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
391 return (int) (revFlag ? GINT32_FROM_BE(x): x);
392 else
393 return (int) (revFlag ? GINT32_FROM_LE(x): x);
394 }else if(f->field_size == 8){
395 gint64 x = *(gint64 *)(e->data + f->offset_root);
396 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
397 return (int) (revFlag ? GINT64_FROM_BE(x): x);
398 else
399 return (int) (revFlag ? GINT64_FROM_LE(x): x);
400 }
401 }
402
403 unsigned long ltt_event_get_long_unsigned(LttEvent *e, LttField *f)
404 {
405 int revFlag = e->tracefile->trace->my_arch_endian ==
406 e->tracefile->trace->system_description->endian ? 0:1;
407 LttTypeEnum t = f->field_type->type_class;
408
409 if(t != LTT_UINT && t != LTT_ENUM)
410 g_error("The type of the field is not unsigned long\n");
411
412 if(f->field_size == 1){
413 guint8 x = *(guint8 *)(e->data + f->offset_root);
414 return (unsigned long) x;
415 }else if(f->field_size == 2){
416 guint16 x = *(guint16 *)(e->data + f->offset_root);
417 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
418 return (unsigned long) (revFlag ? GUINT16_FROM_BE(x): x);
419 else
420 return (unsigned long) (revFlag ? GUINT16_FROM_LE(x): x);
421 }else if(f->field_size == 4){
422 guint32 x = *(guint32 *)(e->data + f->offset_root);
423 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
424 return (unsigned long) (revFlag ? GUINT32_FROM_BE(x): x);
425 else
426 return (unsigned long) (revFlag ? GUINT32_FROM_LE(x): x);
427 }else if(f->field_size == 8){
428 guint64 x = *(guint64 *)(e->data + f->offset_root);
429 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
430 return (unsigned long) (revFlag ? GUINT64_FROM_BE(x): x);
431 else
432 return (unsigned long) (revFlag ? GUINT64_FROM_LE(x): x);
433 }
434 }
435
436 long int ltt_event_get_long_int(LttEvent *e, LttField *f)
437 {
438 int revFlag = e->tracefile->trace->my_arch_endian ==
439 e->tracefile->trace->system_description->endian ? 0:1;
440
441 if( f->field_type->type_class != LTT_INT)
442 g_error("The type of the field is not long int\n");
443
444 if(f->field_size == 1){
445 gint8 x = *(gint8 *)(e->data + f->offset_root);
446 return (long) x;
447 }else if(f->field_size == 2){
448 gint16 x = *(gint16 *)(e->data + f->offset_root);
449 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
450 return (long) (revFlag ? GINT16_FROM_BE(x): x);
451 else
452 return (long) (revFlag ? GINT16_FROM_LE(x): x);
453 }else if(f->field_size == 4){
454 gint32 x = *(gint32 *)(e->data + f->offset_root);
455 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
456 return (long) (revFlag ? GINT32_FROM_BE(x): x);
457 else
458 return (long) (revFlag ? GINT32_FROM_LE(x): x);
459 }else if(f->field_size == 8){
460 gint64 x = *(gint64 *)(e->data + f->offset_root);
461 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
462 return (long) (revFlag ? GINT64_FROM_BE(x): x);
463 else
464 return (long) (revFlag ? GINT64_FROM_LE(x): x);
465 }
466 }
467
468 float ltt_event_get_float(LttEvent *e, LttField *f)
469 {
470 int revFlag = e->tracefile->trace->my_arch_endian ==
471 e->tracefile->trace->system_description->endian ? 0:1;
472
473 if(f->field_type->type_class != LTT_FLOAT ||
474 (f->field_type->type_class == LTT_FLOAT && f->field_size != 4))
475 g_error("The type of the field is not float\n");
476
477 if(revFlag == 0) return *(float *)(e->data + f->offset_root);
478 else{
479 guint32 aInt;
480 memcpy((void*)&aInt, e->data + f->offset_root, 4);
481 aInt = ___swab32(aInt);
482 return *((float*)&aInt);
483 }
484 }
485
486 double ltt_event_get_double(LttEvent *e, LttField *f)
487 {
488 int revFlag = e->tracefile->trace->my_arch_endian ==
489 e->tracefile->trace->system_description->endian ? 0:1;
490
491 if(f->field_type->type_class != LTT_FLOAT ||
492 (f->field_type->type_class == LTT_FLOAT && f->field_size != 8))
493 g_error("The type of the field is not double\n");
494
495 if(revFlag == 0) return *(double *)(e->data + f->offset_root);
496 else{
497 guint64 aInt;
498 memcpy((void*)&aInt, e->data + f->offset_root, 8);
499 aInt = ___swab64(aInt);
500 return *((double *)&aInt);
501 }
502 }
503
504 /*****************************************************************************
505 * The string obtained is only valid until the next read from
506 * the same tracefile.
507 ****************************************************************************/
508
509 char *ltt_event_get_string(LttEvent *e, LttField *f)
510 {
511 if(f->field_type->type_class != LTT_STRING)
512 g_error("The field contains no string\n");
513 return (char*)g_strdup((char*)(e->data + f->offset_root));
514 }
This page took 0.043329 seconds and 4 git commands to generate.