many compile fix
[lttv.git] / ltt / branches / poly / ltt / event.c
CommitLineData
449cb9d7 1/* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 Xiangxiu Yang
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
16 * MA 02111-1307, USA.
17 */
18
6cd62ccf 19#include <stdio.h>
8d1e6362 20#include <string.h>
21#include <stdlib.h>
22
6cd62ccf 23#include <asm/types.h>
24#include <linux/byteorder/swab.h>
a5dcde2f 25
6cd62ccf 26#include "parser.h"
a5dcde2f 27#include <ltt/ltt.h>
28#include "ltt-private.h"
6cd62ccf 29#include <ltt/event.h>
a5dcde2f 30#include <ltt/trace.h>
0f7f40c1 31#include <ltt/ltt-types.h>
6cd62ccf 32
c02ea99f 33
34LttEvent *ltt_event_new()
35{
36 return g_new(LttEvent, 1);
37}
38
39void ltt_event_destroy(LttEvent *event)
40{
41 g_free(event);
42}
43
44
908f42fa 45/*****************************************************************************
46 *Function name
47 * ltt_event_refresh_fields : refresh fields of an event
48 *Input params
49 * offsetRoot : offset from the root
18206708 50 * offsetParent : offset from the parent
908f42fa 51 * fld : field
52 * evD : event data
0f7f40c1 53 * reverse_byte_order : 1 or 0
908f42fa 54 *Return value
55 * int : size of the field
56 ****************************************************************************/
57
58int ltt_event_refresh_fields(int offsetRoot,int offsetParent,
0f7f40c1 59 LttField * fld, void *evD, gboolean reverse_byte_order)
908f42fa 60{
61 int size, size1, element_number, i, offset1, offset2;
62 LttType * type = fld->field_type;
63
cf74a6f1 64 switch(type->type_class) {
65 case LTT_ARRAY:
66 element_number = (int) type->element_number;
67 if(fld->field_fixed == 0){// has string or sequence
68 size = 0;
69 for(i=0;i<element_number;i++){
70 size += ltt_event_refresh_fields(offsetRoot+size,size,
0f7f40c1 71 fld->child[0], evD+size, reverse_byte_order);
cf74a6f1 72 }
73 }else size = fld->field_size;
74 break;
75
76 case LTT_SEQUENCE:
77 size1 = fld->sequ_number_size;
0f7f40c1 78 element_number = getIntNumber(reverse_byte_order,size1,evD);
cf74a6f1 79 type->element_number = element_number;
80 if(fld->element_size > 0){
81 size = element_number * fld->element_size;
82 }else{//sequence has string or sequence
83 size = 0;
84 for(i=0;i<element_number;i++){
85 size += ltt_event_refresh_fields(offsetRoot+size+size1,size+size1,
0f7f40c1 86 fld->child[0], evD+size+size1, reverse_byte_order);
cf74a6f1 87 }
88 size += size1;
89 }
90 break;
91
92 case LTT_STRING:
93 size = strlen((char*)evD) + 1; //include end : '\0'
94 break;
95
96 case LTT_STRUCT:
97 element_number = (int) type->element_number;
98 if(fld->field_fixed == 0){
99 offset1 = offsetRoot;
100 offset2 = 0;
101 for(i=0;i<element_number;i++){
102 size=ltt_event_refresh_fields(offset1,offset2,
0f7f40c1 103 fld->child[i],evD+offset2, reverse_byte_order);
cf74a6f1 104 offset1 += size;
105 offset2 += size;
106 }
107 size = offset2;
108 }else size = fld->field_size;
109 break;
e52d9126 110
111 case LTT_UNION:
112 size = fld->field_size;
113 break;
cf74a6f1 114
115 default:
116 size = fld->field_size;
117 }
118
119#if 0
908f42fa 120 if(type->type_class != LTT_STRUCT && type->type_class != LTT_ARRAY &&
121 type->type_class != LTT_SEQUENCE && type->type_class != LTT_STRING){
122 size = fld->field_size;
123 }else if(type->type_class == LTT_ARRAY){
124 element_number = (int) type->element_number;
125 if(fld->field_fixed == 0){// has string or sequence
126 size = 0;
127 for(i=0;i<element_number;i++){
cf74a6f1 128 size += ltt_event_refresh_fields(offsetRoot+size,size,
908f42fa 129 fld->child[0], evD+size);
cf74a6f1 130 }
908f42fa 131 }else size = fld->field_size;
132 }else if(type->type_class == LTT_SEQUENCE){
133 size1 = fld->sequ_number_size;
134 element_number = getIntNumber(size1,evD);
135 type->element_number = element_number;
136 if(fld->element_size > 0){
137 size = element_number * fld->element_size;
138 }else{//sequence has string or sequence
139 size = 0;
140 for(i=0;i<element_number;i++){
cf74a6f1 141 size += ltt_event_refresh_fields(offsetRoot+size+size1,size+size1,
142 fld->child[0], evD+size+size1);
908f42fa 143 }
144 size += size1;
145 }
146 }else if(type->type_class == LTT_STRING){
147 size = strlen((char*)evD) + 1; //include end : '\0'
148 }else if(type->type_class == LTT_STRUCT){
149 element_number = (int) type->element_number;
150 if(fld->field_fixed == 0){
151 offset1 = offsetRoot;
152 offset2 = 0;
153 for(i=0;i<element_number;i++){
cf74a6f1 154 size=ltt_event_refresh_fields(offset1,offset2,
155 fld->child[i],evD+offset2);
156 offset1 += size;
157 offset2 += size;
908f42fa 158 }
159 size = offset2;
160 }else size = fld->field_size;
161 }
cf74a6f1 162#endif //0
908f42fa 163 fld->offset_root = offsetRoot;
164 fld->offset_parent = offsetParent;
165 fld->fixed_root = (offsetRoot==-1) ? 0 : 1;
166 fld->fixed_parent = (offsetParent==-1) ? 0 : 1;
167 fld->field_size = size;
168
169 return size;
170}
171
6cd62ccf 172/*****************************************************************************
173 *Function name
963b5f2d 174 * ltt_event_eventtype_id: get event type id
175 * (base id + position of the event)
6cd62ccf 176 *Input params
963b5f2d 177 * e : an instance of an event type
6cd62ccf 178 *Return value
963b5f2d 179 * unsigned : event type id
6cd62ccf 180 ****************************************************************************/
181
963b5f2d 182unsigned ltt_event_eventtype_id(LttEvent *e)
6cd62ccf 183{
184 return (unsigned) e->event_id;
185}
186
187/*****************************************************************************
188 *Function name
189 * ltt_event_facility : get the facility of the event
190 *Input params
191 * e : an instance of an event type
192 *Return value
963b5f2d 193 * LttFacility * : the facility of the event
6cd62ccf 194 ****************************************************************************/
195
963b5f2d 196LttFacility *ltt_event_facility(LttEvent *e)
6cd62ccf 197{
963b5f2d 198 LttTrace * trace = e->tracefile->trace;
199 unsigned id = e->event_id;
200 return ltt_trace_facility_by_id(trace,id);
6cd62ccf 201}
202
203/*****************************************************************************
204 *Function name
205 * ltt_event_eventtype : get the event type of the event
206 *Input params
207 * e : an instance of an event type
208 *Return value
963b5f2d 209 * LttEventType * : the event type of the event
6cd62ccf 210 ****************************************************************************/
211
963b5f2d 212LttEventType *ltt_event_eventtype(LttEvent *e)
6cd62ccf 213{
963b5f2d 214 LttFacility* facility = ltt_event_facility(e);
215 if(!facility) return NULL;
216 return facility->events[e->event_id - facility->base_id];
6cd62ccf 217}
218
219/*****************************************************************************
220 *Function name
963b5f2d 221 * ltt_event_field : get the root field of the event
6cd62ccf 222 *Input params
963b5f2d 223 * e : an instance of an event type
6cd62ccf 224 *Return value
963b5f2d 225 * LttField * : the root field of the event
6cd62ccf 226 ****************************************************************************/
227
963b5f2d 228LttField *ltt_event_field(LttEvent *e)
6cd62ccf 229{
908f42fa 230 LttField * field;
963b5f2d 231 LttEventType * event_type = ltt_event_eventtype(e);
1d1df11d 232 if(unlikely(!event_type)) return NULL;
908f42fa 233 field = event_type->root_field;
1d1df11d 234 if(unlikely(!field)) return NULL;
908f42fa 235
236 //check if the field need refresh
1d1df11d 237 if(likely(e->which_block != event_type->latest_block ||
238 e->which_event != event_type->latest_event)){
908f42fa 239
240 event_type->latest_block = e->which_block;
241 event_type->latest_event = e->which_event;
242
1d1df11d 243 if(unlikely(field->field_fixed != 1))
0f7f40c1 244 ltt_event_refresh_fields(0, 0, field, e->data,
245 e->tracefile->trace->reverse_byte_order);
908f42fa 246 }
247 return field;
6cd62ccf 248}
249
250/*****************************************************************************
251 *Function name
963b5f2d 252 * ltt_event_time : get the time of the event
6cd62ccf 253 *Input params
254 * e : an instance of an event type
255 *Return value
963b5f2d 256 * LttTime : the time of the event
6cd62ccf 257 ****************************************************************************/
258
963b5f2d 259LttTime ltt_event_time(LttEvent *e)
6cd62ccf 260{
963b5f2d 261 return e->event_time;
6cd62ccf 262}
263
264/*****************************************************************************
265 *Function name
963b5f2d 266 * ltt_event_time : get the cycle count of the event
6cd62ccf 267 *Input params
268 * e : an instance of an event type
269 *Return value
963b5f2d 270 * LttCycleCount : the cycle count of the event
6cd62ccf 271 ****************************************************************************/
272
963b5f2d 273LttCycleCount ltt_event_cycle_count(LttEvent *e)
6cd62ccf 274{
963b5f2d 275 return e->event_cycle_count;
6cd62ccf 276}
277
80da81ad 278/*****************************************************************************
279 *Function name
280 * ltt_event_position : get the event's position
281 *Input params
282 * e : an instance of an event type
283 * ep : a pointer to event's position structure
284 ****************************************************************************/
285
286void ltt_event_position(LttEvent *e, LttEventPosition *ep)
287{
288 ep->block_num = e->which_block;
289 ep->event_num = e->which_event;
290 ep->event_time = e->event_time;
291 ep->event_cycle_count = e->event_cycle_count;
292 ep->heart_beat_number = e->tracefile->cur_heart_beat_number;
18206708 293 ep->old_position = TRUE;
80da81ad 294 ep->event_offset = e->data - e->tracefile->buffer - EVENT_HEADER_SIZE ;
e4eced0f 295 ep->tf = e->tracefile;
2dee981d 296 ep->overflow_nsec = e->overflow_nsec;
18206708 297 /* This is a workaround for fast position seek */
298 ep->last_event_pos = e->last_event_pos;
299 ep->prev_block_end_time = e->prev_block_end_time;
300 ep->prev_event_time = e->prev_event_time;
301 ep->pre_cycle_count = e->pre_cycle_count;
302 ep->count = e->count;
dfb73233 303 ep->last_heartbeat = e->last_heartbeat;
304
18206708 305 /* end of workaround */
80da81ad 306}
307
a5dcde2f 308LttEventPosition * ltt_event_position_new()
309{
310 return g_new(LttEventPosition, 1);
311}
312
80da81ad 313/*****************************************************************************
314 *Function name
315 * ltt_event_position_get : get the block number and index of the event
316 *Input params
317 * ep : a pointer to event's position structure
318 * block_number : the block number of the event
319 * index_in_block : the index of the event within the block
320 ****************************************************************************/
321
322void ltt_event_position_get(LttEventPosition *ep,
e4eced0f 323 unsigned *block_number, unsigned *index_in_block, LttTracefile ** tf)
80da81ad 324{
325 *block_number = ep->block_num;
326 *index_in_block = ep->event_num;
e4eced0f 327 *tf = ep->tf;
80da81ad 328}
329
330/*****************************************************************************
331 *Function name
332 * ltt_event_position_set : set the block number and index of the event
537b2d7f 333 * It does put the old_position gboolean to FALSE, as it is impossible
334 * to know the quick position to seek in the tracefile.
80da81ad 335 *Input params
336 * ep : a pointer to event's position structure
337 * block_number : the block number of the event
338 * index_in_block : the index of the event within the block
339 ****************************************************************************/
340
341void ltt_event_position_set(LttEventPosition *ep,
342 unsigned block_number, unsigned index_in_block)
343{
537b2d7f 344 if(ep->block_num != block_number || ep->event_num != index_in_block)
345 ep->old_position = FALSE;
346
80da81ad 347 ep->block_num = block_number;
537b2d7f 348 ep->event_num = index_in_block;
349
80da81ad 350}
351
96da5c0d 352/*****************************************************************************
353 * Function name
354 * ltt_event_position_compare : compare two positions
a00149f6 355 * A NULL value is infinite.
96da5c0d 356 * Input params
357 * ep1 : a pointer to event's position structure
358 * ep2 : a pointer to event's position structure
359 * Return
360 * -1 is ep1 < ep2
361 * 1 if ep1 > ep2
362 * 0 if ep1 == ep2
363 ****************************************************************************/
364
365
366gint ltt_event_position_compare(const LttEventPosition *ep1,
367 const LttEventPosition *ep2)
368{
369 if(ep1->tf != ep2->tf)
370 g_error("ltt_event_position_compare on different tracefiles makes no sense");
a00149f6 371 if(ep1 == NULL && ep2 == NULL)
372 return 0;
373 if(ep1 != NULL && ep2 == NULL)
374 return -1;
375 if(ep1 == NULL && ep2 != NULL)
376 return 1;
377
96da5c0d 378 if(ep1->block_num < ep2->block_num)
379 return -1;
380 if(ep1->block_num > ep2->block_num)
381 return 1;
382 if(ep1->event_num < ep2->event_num)
383 return -1;
384 if(ep1->event_num > ep2->event_num)
385 return 1;
386 return 0;
387}
388
389/*****************************************************************************
390 * Function name
391 * ltt_event_event_position_compare : compare two positions, one in event,
392 * other in position opaque structure.
393 * Input params
394 * event : a pointer to event structure
395 * ep : a pointer to event's position structure
396 * Return
397 * -1 is event < ep
398 * 1 if event > ep
399 * 0 if event == ep
400 ****************************************************************************/
401
402gint ltt_event_event_position_compare(const LttEvent *event,
403 const LttEventPosition *ep)
404{
a00149f6 405 if(event == NULL && ep == NULL)
406 return 0;
407 if(event != NULL && ep == NULL)
408 return -1;
409 if(event == NULL && ep != NULL)
410 return 1;
2a74fbf4 411
a00149f6 412 g_assert(event->tracefile == ep->tf);
413
0dfebcb9 414 if(event->which_block < ep->block_num)
96da5c0d 415 return -1;
0dfebcb9 416 if(event->which_block > ep->block_num)
96da5c0d 417 return 1;
0dfebcb9 418 if(event->which_event < ep->event_num)
96da5c0d 419 return -1;
0dfebcb9 420 if(event->which_event > ep->event_num)
96da5c0d 421 return 1;
422 return 0;
423}
424
2a74fbf4 425/*****************************************************************************
426 * Function name
427 * ltt_event_position_copy : copy position
428 * Input params
429 * src : a pointer to event's position structure source
430 * dest : a pointer to event's position structure dest
431 * Return
432 * void
433 ****************************************************************************/
434void ltt_event_position_copy(LttEventPosition *dest,
435 const LttEventPosition *src)
436{
a00149f6 437 if(src == NULL)
438 dest = NULL;
439 else
440 *dest = *src;
2a74fbf4 441}
96da5c0d 442
443
6cd62ccf 444/*****************************************************************************
445 *Function name
963b5f2d 446 * ltt_event_cpu_i: get the cpu id where the event happens
6cd62ccf 447 *Input params
448 * e : an instance of an event type
449 *Return value
963b5f2d 450 * unsigned : the cpu id
6cd62ccf 451 ****************************************************************************/
452
963b5f2d 453unsigned ltt_event_cpu_id(LttEvent *e)
dd691a2e 454{
455 char * c1, * c2, * c3;
456 c1 = strrchr(e->tracefile->name,'\\');
457 c2 = strrchr(e->tracefile->name,'/');
458 if(c1 == NULL && c2 == NULL){
459 return (unsigned)atoi(e->tracefile->name);
460 }else if(c1 == NULL){
461 c2++;
462 return (unsigned)atoi(c2);
463 }else if(c2 == NULL){
464 c1++;
465 return (unsigned)atoi(c1);
466 }else{
467 c3 = (c1 > c2) ? c1 : c2;
468 c3++;
469 return (unsigned)atoi(c3);
470 }
6cd62ccf 471}
472
473/*****************************************************************************
474 *Function name
475 * ltt_event_data : get the raw data for the event
476 *Input params
477 * e : an instance of an event type
478 *Return value
479 * void * : pointer to the raw data for the event
480 ****************************************************************************/
481
963b5f2d 482void *ltt_event_data(LttEvent *e)
6cd62ccf 483{
484 return e->data;
485}
486
487/*****************************************************************************
488 *Function name
489 * ltt_event_field_element_number
490 * : The number of elements in a sequence field is specific
491 * to each event. This function returns the number of
492 * elements for an array or sequence field in an event.
493 *Input params
908f42fa 494 * e : an instance of an event type
6cd62ccf 495 * f : a field of the instance
496 *Return value
497 * unsigned : the number of elements for an array/sequence field
498 ****************************************************************************/
499
963b5f2d 500unsigned ltt_event_field_element_number(LttEvent *e, LttField *f)
6cd62ccf 501{
502 if(f->field_type->type_class != LTT_ARRAY &&
503 f->field_type->type_class != LTT_SEQUENCE)
504 return 0;
908f42fa 505
506 if(f->field_type->type_class == LTT_ARRAY)
507 return f->field_type->element_number;
0f7f40c1 508 return (unsigned) getIntNumber(e->tracefile->trace->reverse_byte_order,
509 f->sequ_number_size, e + f->offset_root);
6cd62ccf 510}
511
512/*****************************************************************************
513 *Function name
514 * ltt_event_field_element_select
515 * : Set the currently selected element for a sequence or
516 * array field
517 *Input params
908f42fa 518 * e : an instance of an event type
6cd62ccf 519 * f : a field of the instance
520 * i : the ith element
6cd62ccf 521 ****************************************************************************/
522
963b5f2d 523void ltt_event_field_element_select(LttEvent *e, LttField *f, unsigned i)
6cd62ccf 524{
908f42fa 525 unsigned element_number;
526 LttField *fld;
8d1e6362 527 unsigned int k;
528 int size;
908f42fa 529 void *evD;
530
531 if(f->field_type->type_class != LTT_ARRAY &&
6cd62ccf 532 f->field_type->type_class != LTT_SEQUENCE)
908f42fa 533 return ;
534
535 element_number = ltt_event_field_element_number(e,f);
8d1e6362 536 /* Sanity check for i : 1..n only, and must be lower or equal element_number
537 */
538 if(element_number < i || i == 0) return;
908f42fa 539
540 fld = f->child[0];
541
542 evD = e->data + f->offset_root;
543 size = 0;
544 for(k=0;k<i;k++){
0f7f40c1 545 size += ltt_event_refresh_fields(f->offset_root+size,size, fld, evD+size,
546 e->tracefile->trace->reverse_byte_order);
908f42fa 547 }
908f42fa 548 f->current_element = i - 1;
6cd62ccf 549}
550
551/*****************************************************************************
552 * These functions extract data from an event after architecture specific
553 * conversions
554 ****************************************************************************/
555
63c35f6c 556guint32 ltt_event_get_unsigned(LttEvent *e, LttField *f)
6cd62ccf 557{
0f7f40c1 558 //int revFlag = e->tracefile->trace->my_arch_endian ==
559 // e->tracefile->trace->system_description->endian ? 0:1;
560 gboolean reverse_byte_order = e->tracefile->trace->reverse_byte_order;
561
963b5f2d 562 LttTypeEnum t = f->field_type->type_class;
6cd62ccf 563
2a74fbf4 564 g_assert(t == LTT_UINT || t == LTT_ENUM);
6cd62ccf 565
b7b36242 566 if(f->field_size == 1){
cbd41522 567 guint8 x = *(guint8 *)(e->data + f->offset_root);
63c35f6c 568 return (guint32) x;
b7b36242 569 }else if(f->field_size == 2){
0f7f40c1 570 return (guint32)ltt_get_uint16(reverse_byte_order, e->data + f->offset_root);
b7b36242 571 }else if(f->field_size == 4){
0f7f40c1 572 return (guint32)ltt_get_uint32(reverse_byte_order, e->data + f->offset_root);
63c35f6c 573 }
574#if 0
575 else if(f->field_size == 8){
cbd41522 576 guint64 x = *(guint64 *)(e->data + f->offset_root);
577 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
578 return (unsigned int) (revFlag ? GUINT64_FROM_BE(x): x);
579 else
580 return (unsigned int) (revFlag ? GUINT64_FROM_LE(x): x);
6cd62ccf 581 }
63c35f6c 582#endif //0
8d1e6362 583 g_critical("ltt_event_get_unsigned : field size %i unknown", f->field_size);
584 return 0;
6cd62ccf 585}
586
63c35f6c 587gint32 ltt_event_get_int(LttEvent *e, LttField *f)
6cd62ccf 588{
0f7f40c1 589 gboolean reverse_byte_order = e->tracefile->trace->reverse_byte_order;
590 //int revFlag = e->tracefile->trace->my_arch_endian ==
591 // e->tracefile->trace->system_description->endian ? 0:1;
6cd62ccf 592
2a74fbf4 593 g_assert(f->field_type->type_class == LTT_INT);
6cd62ccf 594
b7b36242 595 if(f->field_size == 1){
cbd41522 596 gint8 x = *(gint8 *)(e->data + f->offset_root);
63c35f6c 597 return (gint32) x;
b7b36242 598 }else if(f->field_size == 2){
0f7f40c1 599 return (gint32)ltt_get_int16(reverse_byte_order, e->data + f->offset_root);
b7b36242 600 }else if(f->field_size == 4){
0f7f40c1 601 return (gint32)ltt_get_int32(reverse_byte_order, e->data + f->offset_root);
63c35f6c 602 }
603#if 0
604 else if(f->field_size == 8){
cbd41522 605 gint64 x = *(gint64 *)(e->data + f->offset_root);
606 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
607 return (int) (revFlag ? GINT64_FROM_BE(x): x);
608 else
609 return (int) (revFlag ? GINT64_FROM_LE(x): x);
6cd62ccf 610 }
63c35f6c 611#endif //0
8d1e6362 612 g_critical("ltt_event_get_int : field size %i unknown", f->field_size);
613 return 0;
6cd62ccf 614}
615
63c35f6c 616guint64 ltt_event_get_long_unsigned(LttEvent *e, LttField *f)
6cd62ccf 617{
0f7f40c1 618 gboolean reverse_byte_order = e->tracefile->trace->reverse_byte_order;
619 //int revFlag = e->tracefile->trace->my_arch_endian ==
620 // e->tracefile->trace->system_description->endian ? 0:1;
963b5f2d 621 LttTypeEnum t = f->field_type->type_class;
6cd62ccf 622
2a74fbf4 623 g_assert(t == LTT_UINT || t == LTT_ENUM);
6cd62ccf 624
b7b36242 625 if(f->field_size == 1){
cbd41522 626 guint8 x = *(guint8 *)(e->data + f->offset_root);
63c35f6c 627 return (guint64) x;
b7b36242 628 }else if(f->field_size == 2){
0f7f40c1 629 return (guint64)ltt_get_uint16(reverse_byte_order, e->data + f->offset_root);
b7b36242 630 }else if(f->field_size == 4){
0f7f40c1 631 return (guint64)ltt_get_uint32(reverse_byte_order, e->data + f->offset_root);
b7b36242 632 }else if(f->field_size == 8){
0f7f40c1 633 return ltt_get_uint64(reverse_byte_order, e->data + f->offset_root);
6cd62ccf 634 }
8d1e6362 635 g_critical("ltt_event_get_long_unsigned : field size %i unknown", f->field_size);
636 return 0;
6cd62ccf 637}
638
63c35f6c 639gint64 ltt_event_get_long_int(LttEvent *e, LttField *f)
6cd62ccf 640{
0f7f40c1 641 //int revFlag = e->tracefile->trace->my_arch_endian ==
642 // e->tracefile->trace->system_description->endian ? 0:1;
643 gboolean reverse_byte_order = e->tracefile->trace->reverse_byte_order;
6cd62ccf 644
2a74fbf4 645 g_assert( f->field_type->type_class == LTT_INT);
6cd62ccf 646
b7b36242 647 if(f->field_size == 1){
cbd41522 648 gint8 x = *(gint8 *)(e->data + f->offset_root);
63c35f6c 649 return (gint64) x;
b7b36242 650 }else if(f->field_size == 2){
0f7f40c1 651 return (gint64)ltt_get_int16(reverse_byte_order, e->data + f->offset_root);
b7b36242 652 }else if(f->field_size == 4){
0f7f40c1 653 return (gint64)ltt_get_int32(reverse_byte_order, e->data + f->offset_root);
b7b36242 654 }else if(f->field_size == 8){
0f7f40c1 655 return ltt_get_int64(reverse_byte_order, e->data + f->offset_root);
6cd62ccf 656 }
8d1e6362 657 g_critical("ltt_event_get_long_int : field size %i unknown", f->field_size);
658 return 0;
6cd62ccf 659}
660
963b5f2d 661float ltt_event_get_float(LttEvent *e, LttField *f)
6cd62ccf 662{
0f7f40c1 663 //int revFlag = e->tracefile->trace->my_arch_endian ==
664 // e->tracefile->trace->system_description->endian ? 0:1;
665 gboolean reverse_byte_order = e->tracefile->trace->reverse_byte_order;
6cd62ccf 666
2a74fbf4 667 g_assert(f->field_type->type_class == LTT_FLOAT && f->field_size == 4);
6cd62ccf 668
0f7f40c1 669 if(reverse_byte_order == 0) return *(float *)(e->data + f->offset_root);
6cd62ccf 670 else{
cbd41522 671 guint32 aInt;
6cd62ccf 672 memcpy((void*)&aInt, e->data + f->offset_root, 4);
673 aInt = ___swab32(aInt);
cf74a6f1 674 return ((float)aInt);
6cd62ccf 675 }
676}
677
963b5f2d 678double ltt_event_get_double(LttEvent *e, LttField *f)
6cd62ccf 679{
0f7f40c1 680 gboolean reverse_byte_order = e->tracefile->trace->reverse_byte_order;
681 //int revFlag = e->tracefile->trace->my_arch_endian ==
682 // e->tracefile->trace->system_description->endian ? 0:1;
6cd62ccf 683
2a74fbf4 684 g_assert(f->field_type->type_class == LTT_FLOAT && f->field_size == 8);
6cd62ccf 685
0f7f40c1 686 if(reverse_byte_order == 0) return *(double *)(e->data + f->offset_root);
6cd62ccf 687 else{
cbd41522 688 guint64 aInt;
6cd62ccf 689 memcpy((void*)&aInt, e->data + f->offset_root, 8);
690 aInt = ___swab64(aInt);
cf74a6f1 691 return ((double)aInt);
6cd62ccf 692 }
693}
694
695/*****************************************************************************
696 * The string obtained is only valid until the next read from
908f42fa 697 * the same tracefile.
6cd62ccf 698 ****************************************************************************/
699
963b5f2d 700char *ltt_event_get_string(LttEvent *e, LttField *f)
6cd62ccf 701{
2a74fbf4 702 g_assert(f->field_type->type_class == LTT_STRING);
703
6cd62ccf 704 return (char*)g_strdup((char*)(e->data + f->offset_root));
705}
This page took 0.063022 seconds and 4 git commands to generate.