git-svn-id: http://ltt.polymtl.ca/svn@158 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;
139
140 //check if the field need refresh
141 if(e->which_block != event_type->latest_block ||
142 e->which_event != event_type->latest_event){
143
144 event_type->latest_block = e->which_block;
145 event_type->latest_event = e->which_event;
146
147 if(field->field_fixed == 1)return field;
148
149 //refresh the field
150 ltt_event_refresh_fields(0, 0, field, e->data);
151 }
152 return field;
6cd62ccf 153}
154
155/*****************************************************************************
156 *Function name
963b5f2d 157 * ltt_event_time : get the time of the event
6cd62ccf 158 *Input params
159 * e : an instance of an event type
160 *Return value
963b5f2d 161 * LttTime : the time of the event
6cd62ccf 162 ****************************************************************************/
163
963b5f2d 164LttTime ltt_event_time(LttEvent *e)
6cd62ccf 165{
963b5f2d 166 return e->event_time;
6cd62ccf 167}
168
169/*****************************************************************************
170 *Function name
963b5f2d 171 * ltt_event_time : get the cycle count of the event
6cd62ccf 172 *Input params
173 * e : an instance of an event type
174 *Return value
963b5f2d 175 * LttCycleCount : the cycle count of the event
6cd62ccf 176 ****************************************************************************/
177
963b5f2d 178LttCycleCount ltt_event_cycle_count(LttEvent *e)
6cd62ccf 179{
963b5f2d 180 return e->event_cycle_count;
6cd62ccf 181}
182
183/*****************************************************************************
184 *Function name
963b5f2d 185 * ltt_event_cpu_i: get the cpu id where the event happens
6cd62ccf 186 *Input params
187 * e : an instance of an event type
188 *Return value
963b5f2d 189 * unsigned : the cpu id
6cd62ccf 190 ****************************************************************************/
191
963b5f2d 192unsigned ltt_event_cpu_id(LttEvent *e)
193{
194 return (unsigned)atoi(e->tracefile->name);
6cd62ccf 195}
196
197/*****************************************************************************
198 *Function name
199 * ltt_event_data : get the raw data for the event
200 *Input params
201 * e : an instance of an event type
202 *Return value
203 * void * : pointer to the raw data for the event
204 ****************************************************************************/
205
963b5f2d 206void *ltt_event_data(LttEvent *e)
6cd62ccf 207{
208 return e->data;
209}
210
211/*****************************************************************************
212 *Function name
213 * ltt_event_field_element_number
214 * : The number of elements in a sequence field is specific
215 * to each event. This function returns the number of
216 * elements for an array or sequence field in an event.
217 *Input params
908f42fa 218 * e : an instance of an event type
6cd62ccf 219 * f : a field of the instance
220 *Return value
221 * unsigned : the number of elements for an array/sequence field
222 ****************************************************************************/
223
963b5f2d 224unsigned ltt_event_field_element_number(LttEvent *e, LttField *f)
6cd62ccf 225{
226 if(f->field_type->type_class != LTT_ARRAY &&
227 f->field_type->type_class != LTT_SEQUENCE)
228 return 0;
908f42fa 229
230 if(f->field_type->type_class == LTT_ARRAY)
231 return f->field_type->element_number;
232 return (unsigned) getIntNumber(f->sequ_number_size, e + f->offset_root);
6cd62ccf 233}
234
235/*****************************************************************************
236 *Function name
237 * ltt_event_field_element_select
238 * : Set the currently selected element for a sequence or
239 * array field
240 *Input params
908f42fa 241 * e : an instance of an event type
6cd62ccf 242 * f : a field of the instance
243 * i : the ith element
6cd62ccf 244 ****************************************************************************/
245
963b5f2d 246void ltt_event_field_element_select(LttEvent *e, LttField *f, unsigned i)
6cd62ccf 247{
908f42fa 248 unsigned element_number;
249 LttField *fld;
250 int k, size;
251 void *evD;
252
253 if(f->field_type->type_class != LTT_ARRAY &&
6cd62ccf 254 f->field_type->type_class != LTT_SEQUENCE)
908f42fa 255 return ;
256
257 element_number = ltt_event_field_element_number(e,f);
89d4760c 258 if((element_number-1) < i || i < 0) return;
908f42fa 259
260 fld = f->child[0];
261
262 evD = e->data + f->offset_root;
263 size = 0;
264 for(k=0;k<i;k++){
265 size += ltt_event_refresh_fields(f->offset_root+size,size, fld, evD+size);
266 }
6cd62ccf 267
908f42fa 268 f->current_element = i - 1;
6cd62ccf 269}
270
271/*****************************************************************************
272 * These functions extract data from an event after architecture specific
273 * conversions
274 ****************************************************************************/
275
963b5f2d 276unsigned ltt_event_get_unsigned(LttEvent *e, LttField *f)
6cd62ccf 277{
963b5f2d 278 LttArchSize rSize = e->tracefile->trace->system_description->size;
279 int revFlag = e->tracefile->trace->my_arch_endian ==
280 e->tracefile->trace->system_description->endian ? 0:1;
281 LttTypeEnum t = f->field_type->type_class;
6cd62ccf 282
c687f6c8 283 if(t != LTT_UINT && t != LTT_ENUM)
6cd62ccf 284 g_error("The type of the field is not unsigned int\n");
285
286 if(rSize == LTT_LP32){
287 if(f->field_size != 2)
288 g_error("The type of the field is not unsigned int: uint16_t\n");
289 else{
290 uint16_t x = *(uint16_t *)(e->data + f->offset_root);
291 return (unsigned) (revFlag ? BREV16(x) : x);
292 }
293 }else if(rSize == LTT_ILP32 || rSize == LTT_LP64){
294 if(f->field_size != 4)
295 g_error("The type of the field is not unsigned int: uint32_t\n");
296 else{
297 uint32_t x = *(uint32_t *)(e->data + f->offset_root);
298 return (unsigned) (revFlag ? BREV32(x): x);
299 }
300 }else if(rSize == LTT_ILP64){
301 if(f->field_size != 8)
302 g_error("The type of the field is not unsigned int: uint64_t\n");
303 else{
304 uint64_t x = *(uint64_t *)(e->data + f->offset_root);
305 return (unsigned) (revFlag ? BREV64(x): x);
306 }
307 }
308}
309
963b5f2d 310int ltt_event_get_int(LttEvent *e, LttField *f)
6cd62ccf 311{
963b5f2d 312 LttArchSize rSize = e->tracefile->trace->system_description->size;
313 int revFlag = e->tracefile->trace->my_arch_endian ==
314 e->tracefile->trace->system_description->endian ? 0:1;
6cd62ccf 315
316 if(f->field_type->type_class != LTT_INT)
317 g_error("The type of the field is not int\n");
318
319 if(rSize == LTT_LP32){
320 if(f->field_size != 2)
321 g_error("The type of the field is not int: int16_t\n");
322 else{
323 int16_t x = *(int16_t *)(e->data + f->offset_root);
324 return (int) (revFlag ? BREV16(x) : x);
325 }
326 }else if(rSize == LTT_ILP32 || rSize == LTT_LP64){
327 if(f->field_size != 4)
328 g_error("The type of the field is not int: int32_t\n");
329 else{
330 int32_t x = *(int32_t *)(e->data + f->offset_root);
331 return (int) (revFlag ? BREV32(x): x);
332 }
333 }else if(rSize == LTT_ILP64){
334 if(f->field_size != 8)
335 g_error("The type of the field is not int: int64_t\n");
336 else{
337 int64_t x = *(int64_t *)(e->data + f->offset_root);
338 return (int) (revFlag ? BREV64(x): x);
339 }
340 }
341}
342
963b5f2d 343unsigned long ltt_event_get_long_unsigned(LttEvent *e, LttField *f)
6cd62ccf 344{
963b5f2d 345 LttArchSize rSize = e->tracefile->trace->system_description->size;
346 int revFlag = e->tracefile->trace->my_arch_endian ==
347 e->tracefile->trace->system_description->endian ? 0:1;
348 LttTypeEnum t = f->field_type->type_class;
6cd62ccf 349
c687f6c8 350 if(t != LTT_UINT && t != LTT_ENUM)
6cd62ccf 351 g_error("The type of the field is not unsigned long\n");
352
353 if(rSize == LTT_LP32 || rSize == LTT_ILP32 ){
354 if(f->field_size != 4)
355 g_error("The type of the field is not unsigned long: uint32_t\n");
356 else{
357 uint32_t x = *(uint32_t *)(e->data + f->offset_root);
358 return (unsigned long) (revFlag ? BREV32(x) : x);
359 }
360 }else if(rSize == LTT_LP64 || rSize == LTT_ILP64){
361 if(f->field_size != 8)
362 g_error("The type of the field is not unsigned long: uint64_t\n");
363 else{
364 uint64_t x = *(uint64_t *)(e->data + f->offset_root);
365 return (unsigned long) (revFlag ? BREV64(x): x);
366 }
367 }
368}
369
963b5f2d 370long int ltt_event_get_long_int(LttEvent *e, LttField *f)
6cd62ccf 371{
963b5f2d 372 LttArchSize rSize = e->tracefile->trace->system_description->size;
373 int revFlag = e->tracefile->trace->my_arch_endian ==
374 e->tracefile->trace->system_description->endian ? 0:1;
6cd62ccf 375
376 if( f->field_type->type_class != LTT_INT)
377 g_error("The type of the field is not long int\n");
378
379 if(rSize == LTT_LP32 || rSize == LTT_ILP32 ){
380 if(f->field_size != 4)
381 g_error("The type of the field is not long int: int32_t\n");
382 else{
383 int32_t x = *(int32_t *)(e->data + f->offset_root);
384 return (long) (revFlag ? BREV32(x) : x);
385 }
386 }else if(rSize == LTT_LP64 || rSize == LTT_ILP64){
387 if(f->field_size != 8)
388 g_error("The type of the field is not long int: int64_t\n");
389 else{
390 int64_t x = *(int64_t *)(e->data + f->offset_root);
391 return (long) (revFlag ? BREV64(x): x);
392 }
393 }
394}
395
963b5f2d 396float ltt_event_get_float(LttEvent *e, LttField *f)
6cd62ccf 397{
963b5f2d 398 int revFlag = e->tracefile->trace->my_arch_endian ==
399 e->tracefile->trace->system_description->endian ? 0:1;
6cd62ccf 400
401 if(f->field_type->type_class != LTT_FLOAT ||
402 (f->field_type->type_class == LTT_FLOAT && f->field_size != 4))
403 g_error("The type of the field is not float\n");
404
405 if(revFlag == 0) return *(float *)(e->data + f->offset_root);
406 else{
407 uint32_t aInt;
408 memcpy((void*)&aInt, e->data + f->offset_root, 4);
409 aInt = ___swab32(aInt);
410 return *((float*)&aInt);
411 }
412}
413
963b5f2d 414double ltt_event_get_double(LttEvent *e, LttField *f)
6cd62ccf 415{
963b5f2d 416 int revFlag = e->tracefile->trace->my_arch_endian ==
417 e->tracefile->trace->system_description->endian ? 0:1;
6cd62ccf 418
419 if(f->field_type->type_class != LTT_FLOAT ||
420 (f->field_type->type_class == LTT_FLOAT && f->field_size != 8))
421 g_error("The type of the field is not double\n");
422
423 if(revFlag == 0) return *(double *)(e->data + f->offset_root);
424 else{
425 uint64_t aInt;
426 memcpy((void*)&aInt, e->data + f->offset_root, 8);
427 aInt = ___swab64(aInt);
428 return *((double *)&aInt);
429 }
430}
431
432/*****************************************************************************
433 * The string obtained is only valid until the next read from
908f42fa 434 * the same tracefile.
6cd62ccf 435 ****************************************************************************/
436
963b5f2d 437char *ltt_event_get_string(LttEvent *e, LttField *f)
6cd62ccf 438{
439 if(f->field_type->type_class != LTT_STRING)
440 g_error("The field contains no string\n");
441 return (char*)g_strdup((char*)(e->data + f->offset_root));
442}
This page took 0.042214 seconds and 4 git commands to generate.