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