position ok with processing
[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>
20#include <asm/types.h>
21#include <linux/byteorder/swab.h>
a5dcde2f 22
6cd62ccf 23#include "parser.h"
a5dcde2f 24#include <ltt/ltt.h>
25#include "ltt-private.h"
6cd62ccf 26#include <ltt/event.h>
a5dcde2f 27#include <ltt/trace.h>
6cd62ccf 28
908f42fa 29/*****************************************************************************
30 *Function name
31 * ltt_event_refresh_fields : refresh fields of an event
32 *Input params
33 * offsetRoot : offset from the root
34 * offsetParent : offset from the parrent
35 * fld : field
36 * evD : event data
37 *Return value
38 * int : size of the field
39 ****************************************************************************/
40
41int ltt_event_refresh_fields(int offsetRoot,int offsetParent,
42 LttField * fld, void *evD)
43{
44 int size, size1, element_number, i, offset1, offset2;
45 LttType * type = fld->field_type;
46
47 if(type->type_class != LTT_STRUCT && type->type_class != LTT_ARRAY &&
48 type->type_class != LTT_SEQUENCE && type->type_class != LTT_STRING){
49 size = fld->field_size;
50 }else if(type->type_class == LTT_ARRAY){
51 element_number = (int) type->element_number;
52 if(fld->field_fixed == 0){// has string or sequence
53 size = 0;
54 for(i=0;i<element_number;i++){
55 size += ltt_event_refresh_fields(offsetRoot+size,size,
56 fld->child[0], evD+size);
57 }
58 }else size = fld->field_size;
59 }else if(type->type_class == LTT_SEQUENCE){
60 size1 = fld->sequ_number_size;
61 element_number = getIntNumber(size1,evD);
62 type->element_number = element_number;
63 if(fld->element_size > 0){
64 size = element_number * fld->element_size;
65 }else{//sequence has string or sequence
66 size = 0;
67 for(i=0;i<element_number;i++){
68 size += ltt_event_refresh_fields(offsetRoot+size+size1,size+size1,
69 fld->child[0], evD+size+size1);
70 }
71 size += size1;
72 }
73 }else if(type->type_class == LTT_STRING){
74 size = strlen((char*)evD) + 1; //include end : '\0'
75 }else if(type->type_class == LTT_STRUCT){
76 element_number = (int) type->element_number;
77 if(fld->field_fixed == 0){
78 offset1 = offsetRoot;
79 offset2 = 0;
80 for(i=0;i<element_number;i++){
81 size=ltt_event_refresh_fields(offset1,offset2,fld->child[i],evD+offset2);
82 offset1 += size;
83 offset2 += size;
84 }
85 size = offset2;
86 }else size = fld->field_size;
87 }
88
89 fld->offset_root = offsetRoot;
90 fld->offset_parent = offsetParent;
91 fld->fixed_root = (offsetRoot==-1) ? 0 : 1;
92 fld->fixed_parent = (offsetParent==-1) ? 0 : 1;
93 fld->field_size = size;
94
95 return size;
96}
97
6cd62ccf 98/*****************************************************************************
99 *Function name
963b5f2d 100 * ltt_event_eventtype_id: get event type id
101 * (base id + position of the event)
6cd62ccf 102 *Input params
963b5f2d 103 * e : an instance of an event type
6cd62ccf 104 *Return value
963b5f2d 105 * unsigned : event type id
6cd62ccf 106 ****************************************************************************/
107
963b5f2d 108unsigned ltt_event_eventtype_id(LttEvent *e)
6cd62ccf 109{
110 return (unsigned) e->event_id;
111}
112
113/*****************************************************************************
114 *Function name
115 * ltt_event_facility : get the facility of the event
116 *Input params
117 * e : an instance of an event type
118 *Return value
963b5f2d 119 * LttFacility * : the facility of the event
6cd62ccf 120 ****************************************************************************/
121
963b5f2d 122LttFacility *ltt_event_facility(LttEvent *e)
6cd62ccf 123{
963b5f2d 124 LttTrace * trace = e->tracefile->trace;
125 unsigned id = e->event_id;
126 return ltt_trace_facility_by_id(trace,id);
6cd62ccf 127}
128
129/*****************************************************************************
130 *Function name
131 * ltt_event_eventtype : get the event type of the event
132 *Input params
133 * e : an instance of an event type
134 *Return value
963b5f2d 135 * LttEventType * : the event type of the event
6cd62ccf 136 ****************************************************************************/
137
963b5f2d 138LttEventType *ltt_event_eventtype(LttEvent *e)
6cd62ccf 139{
963b5f2d 140 LttFacility* facility = ltt_event_facility(e);
141 if(!facility) return NULL;
142 return facility->events[e->event_id - facility->base_id];
6cd62ccf 143}
144
145/*****************************************************************************
146 *Function name
963b5f2d 147 * ltt_event_field : get the root field of the event
6cd62ccf 148 *Input params
963b5f2d 149 * e : an instance of an event type
6cd62ccf 150 *Return value
963b5f2d 151 * LttField * : the root field of the event
6cd62ccf 152 ****************************************************************************/
153
963b5f2d 154LttField *ltt_event_field(LttEvent *e)
6cd62ccf 155{
908f42fa 156 LttField * field;
963b5f2d 157 LttEventType * event_type = ltt_event_eventtype(e);
158 if(!event_type) return NULL;
908f42fa 159 field = event_type->root_field;
a2331fa0 160 if(!field) return NULL;
908f42fa 161
162 //check if the field need refresh
163 if(e->which_block != event_type->latest_block ||
164 e->which_event != event_type->latest_event){
165
166 event_type->latest_block = e->which_block;
167 event_type->latest_event = e->which_event;
168
169 if(field->field_fixed == 1)return field;
170
171 //refresh the field
172 ltt_event_refresh_fields(0, 0, field, e->data);
173 }
174 return field;
6cd62ccf 175}
176
177/*****************************************************************************
178 *Function name
963b5f2d 179 * ltt_event_time : get the time of the event
6cd62ccf 180 *Input params
181 * e : an instance of an event type
182 *Return value
963b5f2d 183 * LttTime : the time of the event
6cd62ccf 184 ****************************************************************************/
185
963b5f2d 186LttTime ltt_event_time(LttEvent *e)
6cd62ccf 187{
963b5f2d 188 return e->event_time;
6cd62ccf 189}
190
191/*****************************************************************************
192 *Function name
963b5f2d 193 * ltt_event_time : get the cycle count of the event
6cd62ccf 194 *Input params
195 * e : an instance of an event type
196 *Return value
963b5f2d 197 * LttCycleCount : the cycle count of the event
6cd62ccf 198 ****************************************************************************/
199
963b5f2d 200LttCycleCount ltt_event_cycle_count(LttEvent *e)
6cd62ccf 201{
963b5f2d 202 return e->event_cycle_count;
6cd62ccf 203}
204
80da81ad 205/*****************************************************************************
206 *Function name
207 * ltt_event_position : get the event's position
208 *Input params
209 * e : an instance of an event type
210 * ep : a pointer to event's position structure
211 ****************************************************************************/
212
213void ltt_event_position(LttEvent *e, LttEventPosition *ep)
214{
215 ep->block_num = e->which_block;
216 ep->event_num = e->which_event;
217 ep->event_time = e->event_time;
218 ep->event_cycle_count = e->event_cycle_count;
219 ep->heart_beat_number = e->tracefile->cur_heart_beat_number;
e4eced0f 220 ep->old_position = FALSE;
80da81ad 221 ep->event_offset = e->data - e->tracefile->buffer - EVENT_HEADER_SIZE ;
e4eced0f 222 ep->tf = e->tracefile;
80da81ad 223}
224
a5dcde2f 225LttEventPosition * ltt_event_position_new()
226{
227 return g_new(LttEventPosition, 1);
228}
229
80da81ad 230/*****************************************************************************
231 *Function name
232 * ltt_event_position_get : get the block number and index of the event
233 *Input params
234 * ep : a pointer to event's position structure
235 * block_number : the block number of the event
236 * index_in_block : the index of the event within the block
237 ****************************************************************************/
238
239void ltt_event_position_get(LttEventPosition *ep,
e4eced0f 240 unsigned *block_number, unsigned *index_in_block, LttTracefile ** tf)
80da81ad 241{
242 *block_number = ep->block_num;
243 *index_in_block = ep->event_num;
e4eced0f 244 *tf = ep->tf;
80da81ad 245}
246
247/*****************************************************************************
248 *Function name
249 * ltt_event_position_set : set the block number and index of the event
250 *Input params
251 * ep : a pointer to event's position structure
252 * block_number : the block number of the event
253 * index_in_block : the index of the event within the block
254 ****************************************************************************/
255
256void ltt_event_position_set(LttEventPosition *ep,
257 unsigned block_number, unsigned index_in_block)
258{
259 ep->block_num = block_number;
e4eced0f 260 ep->event_num = index_in_block;
80da81ad 261}
262
96da5c0d 263/*****************************************************************************
264 * Function name
265 * ltt_event_position_compare : compare two positions
a00149f6 266 * A NULL value is infinite.
96da5c0d 267 * Input params
268 * ep1 : a pointer to event's position structure
269 * ep2 : a pointer to event's position structure
270 * Return
271 * -1 is ep1 < ep2
272 * 1 if ep1 > ep2
273 * 0 if ep1 == ep2
274 ****************************************************************************/
275
276
277gint ltt_event_position_compare(const LttEventPosition *ep1,
278 const LttEventPosition *ep2)
279{
280 if(ep1->tf != ep2->tf)
281 g_error("ltt_event_position_compare on different tracefiles makes no sense");
a00149f6 282 if(ep1 == NULL && ep2 == NULL)
283 return 0;
284 if(ep1 != NULL && ep2 == NULL)
285 return -1;
286 if(ep1 == NULL && ep2 != NULL)
287 return 1;
288
96da5c0d 289 if(ep1->block_num < ep2->block_num)
290 return -1;
291 if(ep1->block_num > ep2->block_num)
292 return 1;
293 if(ep1->event_num < ep2->event_num)
294 return -1;
295 if(ep1->event_num > ep2->event_num)
296 return 1;
297 return 0;
298}
299
300/*****************************************************************************
301 * Function name
302 * ltt_event_event_position_compare : compare two positions, one in event,
303 * other in position opaque structure.
304 * Input params
305 * event : a pointer to event structure
306 * ep : a pointer to event's position structure
307 * Return
308 * -1 is event < ep
309 * 1 if event > ep
310 * 0 if event == ep
311 ****************************************************************************/
312
313gint ltt_event_event_position_compare(const LttEvent *event,
314 const LttEventPosition *ep)
315{
a00149f6 316 if(event == NULL && ep == NULL)
317 return 0;
318 if(event != NULL && ep == NULL)
319 return -1;
320 if(event == NULL && ep != NULL)
321 return 1;
2a74fbf4 322
a00149f6 323 g_assert(event->tracefile == ep->tf);
324
0dfebcb9 325 if(event->which_block < ep->block_num)
96da5c0d 326 return -1;
0dfebcb9 327 if(event->which_block > ep->block_num)
96da5c0d 328 return 1;
0dfebcb9 329 if(event->which_event < ep->event_num)
96da5c0d 330 return -1;
0dfebcb9 331 if(event->which_event > ep->event_num)
96da5c0d 332 return 1;
333 return 0;
334}
335
2a74fbf4 336/*****************************************************************************
337 * Function name
338 * ltt_event_position_copy : copy position
339 * Input params
340 * src : a pointer to event's position structure source
341 * dest : a pointer to event's position structure dest
342 * Return
343 * void
344 ****************************************************************************/
345void ltt_event_position_copy(LttEventPosition *dest,
346 const LttEventPosition *src)
347{
a00149f6 348 if(src == NULL)
349 dest = NULL;
350 else
351 *dest = *src;
2a74fbf4 352}
96da5c0d 353
354
6cd62ccf 355/*****************************************************************************
356 *Function name
963b5f2d 357 * ltt_event_cpu_i: get the cpu id where the event happens
6cd62ccf 358 *Input params
359 * e : an instance of an event type
360 *Return value
963b5f2d 361 * unsigned : the cpu id
6cd62ccf 362 ****************************************************************************/
363
963b5f2d 364unsigned ltt_event_cpu_id(LttEvent *e)
dd691a2e 365{
366 char * c1, * c2, * c3;
367 c1 = strrchr(e->tracefile->name,'\\');
368 c2 = strrchr(e->tracefile->name,'/');
369 if(c1 == NULL && c2 == NULL){
370 return (unsigned)atoi(e->tracefile->name);
371 }else if(c1 == NULL){
372 c2++;
373 return (unsigned)atoi(c2);
374 }else if(c2 == NULL){
375 c1++;
376 return (unsigned)atoi(c1);
377 }else{
378 c3 = (c1 > c2) ? c1 : c2;
379 c3++;
380 return (unsigned)atoi(c3);
381 }
6cd62ccf 382}
383
384/*****************************************************************************
385 *Function name
386 * ltt_event_data : get the raw data for the event
387 *Input params
388 * e : an instance of an event type
389 *Return value
390 * void * : pointer to the raw data for the event
391 ****************************************************************************/
392
963b5f2d 393void *ltt_event_data(LttEvent *e)
6cd62ccf 394{
395 return e->data;
396}
397
398/*****************************************************************************
399 *Function name
400 * ltt_event_field_element_number
401 * : The number of elements in a sequence field is specific
402 * to each event. This function returns the number of
403 * elements for an array or sequence field in an event.
404 *Input params
908f42fa 405 * e : an instance of an event type
6cd62ccf 406 * f : a field of the instance
407 *Return value
408 * unsigned : the number of elements for an array/sequence field
409 ****************************************************************************/
410
963b5f2d 411unsigned ltt_event_field_element_number(LttEvent *e, LttField *f)
6cd62ccf 412{
413 if(f->field_type->type_class != LTT_ARRAY &&
414 f->field_type->type_class != LTT_SEQUENCE)
415 return 0;
908f42fa 416
417 if(f->field_type->type_class == LTT_ARRAY)
418 return f->field_type->element_number;
419 return (unsigned) getIntNumber(f->sequ_number_size, e + f->offset_root);
6cd62ccf 420}
421
422/*****************************************************************************
423 *Function name
424 * ltt_event_field_element_select
425 * : Set the currently selected element for a sequence or
426 * array field
427 *Input params
908f42fa 428 * e : an instance of an event type
6cd62ccf 429 * f : a field of the instance
430 * i : the ith element
6cd62ccf 431 ****************************************************************************/
432
963b5f2d 433void ltt_event_field_element_select(LttEvent *e, LttField *f, unsigned i)
6cd62ccf 434{
908f42fa 435 unsigned element_number;
436 LttField *fld;
437 int k, size;
438 void *evD;
439
440 if(f->field_type->type_class != LTT_ARRAY &&
6cd62ccf 441 f->field_type->type_class != LTT_SEQUENCE)
908f42fa 442 return ;
443
444 element_number = ltt_event_field_element_number(e,f);
89d4760c 445 if((element_number-1) < i || i < 0) return;
908f42fa 446
447 fld = f->child[0];
448
449 evD = e->data + f->offset_root;
450 size = 0;
451 for(k=0;k<i;k++){
452 size += ltt_event_refresh_fields(f->offset_root+size,size, fld, evD+size);
453 }
6cd62ccf 454
908f42fa 455 f->current_element = i - 1;
6cd62ccf 456}
457
458/*****************************************************************************
459 * These functions extract data from an event after architecture specific
460 * conversions
461 ****************************************************************************/
462
963b5f2d 463unsigned ltt_event_get_unsigned(LttEvent *e, LttField *f)
6cd62ccf 464{
963b5f2d 465 int revFlag = e->tracefile->trace->my_arch_endian ==
466 e->tracefile->trace->system_description->endian ? 0:1;
467 LttTypeEnum t = f->field_type->type_class;
6cd62ccf 468
2a74fbf4 469 g_assert(t == LTT_UINT || t == LTT_ENUM);
6cd62ccf 470
b7b36242 471 if(f->field_size == 1){
cbd41522 472 guint8 x = *(guint8 *)(e->data + f->offset_root);
b7b36242 473 return (unsigned int) x;
474 }else if(f->field_size == 2){
cbd41522 475 guint16 x = *(guint16 *)(e->data + f->offset_root);
476 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
477 return (unsigned int) (revFlag ? GUINT16_FROM_BE(x): x);
478 else
479 return (unsigned int) (revFlag ? GUINT16_FROM_LE(x): x);
b7b36242 480 }else if(f->field_size == 4){
cbd41522 481 guint32 x = *(guint32 *)(e->data + f->offset_root);
482 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
483 return (unsigned int) (revFlag ? GUINT32_FROM_BE(x): x);
484 else
485 return (unsigned int) (revFlag ? GUINT32_FROM_LE(x): x);
b7b36242 486 }else if(f->field_size == 8){
cbd41522 487 guint64 x = *(guint64 *)(e->data + f->offset_root);
488 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
489 return (unsigned int) (revFlag ? GUINT64_FROM_BE(x): x);
490 else
491 return (unsigned int) (revFlag ? GUINT64_FROM_LE(x): x);
6cd62ccf 492 }
493}
494
963b5f2d 495int ltt_event_get_int(LttEvent *e, LttField *f)
6cd62ccf 496{
963b5f2d 497 int revFlag = e->tracefile->trace->my_arch_endian ==
498 e->tracefile->trace->system_description->endian ? 0:1;
6cd62ccf 499
2a74fbf4 500 g_assert(f->field_type->type_class == LTT_INT);
6cd62ccf 501
b7b36242 502 if(f->field_size == 1){
cbd41522 503 gint8 x = *(gint8 *)(e->data + f->offset_root);
b7b36242 504 return (int) x;
505 }else if(f->field_size == 2){
cbd41522 506 gint16 x = *(gint16 *)(e->data + f->offset_root);
507 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
508 return (int) (revFlag ? GINT16_FROM_BE(x): x);
509 else
510 return (int) (revFlag ? GINT16_FROM_LE(x): x);
b7b36242 511 }else if(f->field_size == 4){
cbd41522 512 gint32 x = *(gint32 *)(e->data + f->offset_root);
513 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
514 return (int) (revFlag ? GINT32_FROM_BE(x): x);
515 else
516 return (int) (revFlag ? GINT32_FROM_LE(x): x);
b7b36242 517 }else if(f->field_size == 8){
cbd41522 518 gint64 x = *(gint64 *)(e->data + f->offset_root);
519 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
520 return (int) (revFlag ? GINT64_FROM_BE(x): x);
521 else
522 return (int) (revFlag ? GINT64_FROM_LE(x): x);
6cd62ccf 523 }
524}
525
963b5f2d 526unsigned long ltt_event_get_long_unsigned(LttEvent *e, LttField *f)
6cd62ccf 527{
963b5f2d 528 int revFlag = e->tracefile->trace->my_arch_endian ==
529 e->tracefile->trace->system_description->endian ? 0:1;
530 LttTypeEnum t = f->field_type->type_class;
6cd62ccf 531
2a74fbf4 532 g_assert(t == LTT_UINT || t == LTT_ENUM);
6cd62ccf 533
b7b36242 534 if(f->field_size == 1){
cbd41522 535 guint8 x = *(guint8 *)(e->data + f->offset_root);
b7b36242 536 return (unsigned long) x;
537 }else if(f->field_size == 2){
cbd41522 538 guint16 x = *(guint16 *)(e->data + f->offset_root);
539 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
540 return (unsigned long) (revFlag ? GUINT16_FROM_BE(x): x);
541 else
542 return (unsigned long) (revFlag ? GUINT16_FROM_LE(x): x);
b7b36242 543 }else if(f->field_size == 4){
cbd41522 544 guint32 x = *(guint32 *)(e->data + f->offset_root);
545 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
546 return (unsigned long) (revFlag ? GUINT32_FROM_BE(x): x);
547 else
548 return (unsigned long) (revFlag ? GUINT32_FROM_LE(x): x);
b7b36242 549 }else if(f->field_size == 8){
cbd41522 550 guint64 x = *(guint64 *)(e->data + f->offset_root);
551 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
552 return (unsigned long) (revFlag ? GUINT64_FROM_BE(x): x);
553 else
554 return (unsigned long) (revFlag ? GUINT64_FROM_LE(x): x);
6cd62ccf 555 }
556}
557
963b5f2d 558long int ltt_event_get_long_int(LttEvent *e, LttField *f)
6cd62ccf 559{
963b5f2d 560 int revFlag = e->tracefile->trace->my_arch_endian ==
561 e->tracefile->trace->system_description->endian ? 0:1;
6cd62ccf 562
2a74fbf4 563 g_assert( f->field_type->type_class == LTT_INT);
6cd62ccf 564
b7b36242 565 if(f->field_size == 1){
cbd41522 566 gint8 x = *(gint8 *)(e->data + f->offset_root);
b7b36242 567 return (long) x;
568 }else if(f->field_size == 2){
cbd41522 569 gint16 x = *(gint16 *)(e->data + f->offset_root);
570 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
571 return (long) (revFlag ? GINT16_FROM_BE(x): x);
572 else
573 return (long) (revFlag ? GINT16_FROM_LE(x): x);
b7b36242 574 }else if(f->field_size == 4){
cbd41522 575 gint32 x = *(gint32 *)(e->data + f->offset_root);
576 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
577 return (long) (revFlag ? GINT32_FROM_BE(x): x);
578 else
579 return (long) (revFlag ? GINT32_FROM_LE(x): x);
b7b36242 580 }else if(f->field_size == 8){
cbd41522 581 gint64 x = *(gint64 *)(e->data + f->offset_root);
582 if(e->tracefile->trace->my_arch_endian == LTT_LITTLE_ENDIAN)
583 return (long) (revFlag ? GINT64_FROM_BE(x): x);
584 else
585 return (long) (revFlag ? GINT64_FROM_LE(x): x);
6cd62ccf 586 }
587}
588
963b5f2d 589float ltt_event_get_float(LttEvent *e, LttField *f)
6cd62ccf 590{
963b5f2d 591 int revFlag = e->tracefile->trace->my_arch_endian ==
592 e->tracefile->trace->system_description->endian ? 0:1;
6cd62ccf 593
2a74fbf4 594 g_assert(f->field_type->type_class == LTT_FLOAT && f->field_size == 4);
6cd62ccf 595
596 if(revFlag == 0) return *(float *)(e->data + f->offset_root);
597 else{
cbd41522 598 guint32 aInt;
6cd62ccf 599 memcpy((void*)&aInt, e->data + f->offset_root, 4);
600 aInt = ___swab32(aInt);
601 return *((float*)&aInt);
602 }
603}
604
963b5f2d 605double ltt_event_get_double(LttEvent *e, LttField *f)
6cd62ccf 606{
963b5f2d 607 int revFlag = e->tracefile->trace->my_arch_endian ==
608 e->tracefile->trace->system_description->endian ? 0:1;
6cd62ccf 609
2a74fbf4 610 g_assert(f->field_type->type_class == LTT_FLOAT && f->field_size == 8);
6cd62ccf 611
612 if(revFlag == 0) return *(double *)(e->data + f->offset_root);
613 else{
cbd41522 614 guint64 aInt;
6cd62ccf 615 memcpy((void*)&aInt, e->data + f->offset_root, 8);
616 aInt = ___swab64(aInt);
617 return *((double *)&aInt);
618 }
619}
620
621/*****************************************************************************
622 * The string obtained is only valid until the next read from
908f42fa 623 * the same tracefile.
6cd62ccf 624 ****************************************************************************/
625
963b5f2d 626char *ltt_event_get_string(LttEvent *e, LttField *f)
6cd62ccf 627{
2a74fbf4 628 g_assert(f->field_type->type_class == LTT_STRING);
629
6cd62ccf 630 return (char*)g_strdup((char*)(e->data + f->offset_root));
631}
This page took 0.056177 seconds and 4 git commands to generate.