update script
[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
1b44b0b5 3 * 2006 Mathieu Desnoyers
449cb9d7 4 *
1b44b0b5 5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License Version 2.1 as published by the Free Software Foundation.
449cb9d7 8 *
1b44b0b5 9 * This library is distributed in the hope that it will be useful,
449cb9d7 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
1b44b0b5 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
449cb9d7 13 *
1b44b0b5 14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
449cb9d7 18 */
19
4e4d11b3 20#ifdef HAVE_CONFIG_H
21#include <config.h>
22#endif
23
6cd62ccf 24#include <stdio.h>
8d1e6362 25#include <string.h>
26#include <stdlib.h>
3aee1200 27#include <glib.h>
8d1e6362 28
6cd62ccf 29#include <asm/types.h>
d4214418 30#include <byteswap.h>
a5dcde2f 31
6cd62ccf 32#include "parser.h"
a5dcde2f 33#include <ltt/ltt.h>
34#include "ltt-private.h"
6cd62ccf 35#include <ltt/event.h>
a5dcde2f 36#include <ltt/trace.h>
0f7f40c1 37#include <ltt/ltt-types.h>
6cd62ccf 38
2312de30 39
40
743e50fd 41void compute_fields_offsets(LttTracefile *tf,
42 LttFacility *fac, LttField *field, off_t *offset, void *root);
2312de30 43
44
c02ea99f 45LttEvent *ltt_event_new()
46{
47 return g_new(LttEvent, 1);
48}
49
50void ltt_event_destroy(LttEvent *event)
51{
52 g_free(event);
53}
54
55
6cd62ccf 56/*****************************************************************************
57 *Function name
963b5f2d 58 * ltt_event_eventtype_id: get event type id
59 * (base id + position of the event)
6cd62ccf 60 *Input params
963b5f2d 61 * e : an instance of an event type
6cd62ccf 62 *Return value
963b5f2d 63 * unsigned : event type id
6cd62ccf 64 ****************************************************************************/
65
eed2ef37 66unsigned ltt_event_eventtype_id(const LttEvent *e)
6cd62ccf 67{
68 return (unsigned) e->event_id;
69}
70
71/*****************************************************************************
72 *Function name
73 * ltt_event_facility : get the facility of the event
74 *Input params
75 * e : an instance of an event type
76 *Return value
963b5f2d 77 * LttFacility * : the facility of the event
6cd62ccf 78 ****************************************************************************/
79
eed2ef37 80LttFacility *ltt_event_facility(const LttEvent *e)
6cd62ccf 81{
963b5f2d 82 LttTrace * trace = e->tracefile->trace;
27304273 83 unsigned id = e->facility_id;
84 LttFacility *facility = ltt_trace_facility_by_id(trace,id);
85
86 g_assert(facility->exists);
87
88 return facility;
6cd62ccf 89}
90
eed2ef37 91/*****************************************************************************
92 *Function name
93 * ltt_event_facility_id : get the facility id of the event
94 *Input params
95 * e : an instance of an event type
96 *Return value
97 * unsigned : the facility of the event
98 ****************************************************************************/
99
100unsigned ltt_event_facility_id(const LttEvent *e)
101{
102 return e->facility_id;
103}
104
6cd62ccf 105/*****************************************************************************
106 *Function name
107 * ltt_event_eventtype : get the event type of the event
108 *Input params
109 * e : an instance of an event type
110 *Return value
963b5f2d 111 * LttEventType * : the event type of the event
6cd62ccf 112 ****************************************************************************/
113
eed2ef37 114LttEventType *ltt_event_eventtype(const LttEvent *e)
6cd62ccf 115{
963b5f2d 116 LttFacility* facility = ltt_event_facility(e);
117 if(!facility) return NULL;
3aee1200 118 return &g_array_index(facility->events, LttEventType, e->event_id);
6cd62ccf 119}
120
6cd62ccf 121
122/*****************************************************************************
123 *Function name
963b5f2d 124 * ltt_event_time : get the time of the event
6cd62ccf 125 *Input params
126 * e : an instance of an event type
127 *Return value
963b5f2d 128 * LttTime : the time of the event
6cd62ccf 129 ****************************************************************************/
130
eed2ef37 131LttTime ltt_event_time(const LttEvent *e)
6cd62ccf 132{
963b5f2d 133 return e->event_time;
6cd62ccf 134}
135
136/*****************************************************************************
137 *Function name
963b5f2d 138 * ltt_event_time : get the cycle count of the event
6cd62ccf 139 *Input params
140 * e : an instance of an event type
141 *Return value
963b5f2d 142 * LttCycleCount : the cycle count of the event
6cd62ccf 143 ****************************************************************************/
144
eed2ef37 145LttCycleCount ltt_event_cycle_count(const LttEvent *e)
6cd62ccf 146{
3aee1200 147 return e->tsc;
6cd62ccf 148}
149
eed2ef37 150
151
152/*****************************************************************************
153 *Function name
154 * ltt_event_position_get : get the event position data
155 *Input params
156 * e : an instance of an event type
157 * ep : a pointer to event's position structure
158 * tf : tracefile pointer
159 * block : current block
160 * offset : current offset
161 * tsc : current tsc
162 ****************************************************************************/
163void ltt_event_position_get(LttEventPosition *ep, LttTracefile **tf,
164 guint *block, guint *offset, guint64 *tsc)
165{
166 *tf = ep->tracefile;
167 *block = ep->block;
168 *offset = ep->offset;
169 *tsc = ep->tsc;
170}
171
172
6d0cdf22 173void ltt_event_position_set(LttEventPosition *ep, LttTracefile *tf,
174 guint block, guint offset, guint64 tsc)
175{
176 ep->tracefile = tf;
177 ep->block = block;
178 ep->offset = offset;
179 ep->tsc = tsc;
180}
181
182
80da81ad 183/*****************************************************************************
184 *Function name
185 * ltt_event_position : get the event's position
186 *Input params
187 * e : an instance of an event type
188 * ep : a pointer to event's position structure
189 ****************************************************************************/
190
191void ltt_event_position(LttEvent *e, LttEventPosition *ep)
192{
3aee1200 193 ep->tracefile = e->tracefile;
194 ep->block = e->block;
195 ep->offset = e->offset;
196 ep->tsc = e->tsc;
80da81ad 197}
198
a5dcde2f 199LttEventPosition * ltt_event_position_new()
200{
201 return g_new(LttEventPosition, 1);
202}
203
80da81ad 204
96da5c0d 205/*****************************************************************************
206 * Function name
207 * ltt_event_position_compare : compare two positions
a00149f6 208 * A NULL value is infinite.
96da5c0d 209 * Input params
210 * ep1 : a pointer to event's position structure
211 * ep2 : a pointer to event's position structure
212 * Return
213 * -1 is ep1 < ep2
214 * 1 if ep1 > ep2
215 * 0 if ep1 == ep2
216 ****************************************************************************/
217
218
219gint ltt_event_position_compare(const LttEventPosition *ep1,
220 const LttEventPosition *ep2)
221{
a00149f6 222 if(ep1 == NULL && ep2 == NULL)
223 return 0;
224 if(ep1 != NULL && ep2 == NULL)
225 return -1;
226 if(ep1 == NULL && ep2 != NULL)
227 return 1;
96da5c0d 228
3aee1200 229 if(ep1->tracefile != ep2->tracefile)
230 g_error("ltt_event_position_compare on different tracefiles makes no sense");
231
232 if(ep1->block < ep2->block)
96da5c0d 233 return -1;
3aee1200 234 if(ep1->block > ep2->block)
96da5c0d 235 return 1;
3aee1200 236 if(ep1->offset < ep2->offset)
96da5c0d 237 return -1;
3aee1200 238 if(ep1->offset > ep2->offset)
96da5c0d 239 return 1;
240 return 0;
241}
242
2a74fbf4 243/*****************************************************************************
244 * Function name
245 * ltt_event_position_copy : copy position
246 * Input params
247 * src : a pointer to event's position structure source
248 * dest : a pointer to event's position structure dest
249 * Return
250 * void
251 ****************************************************************************/
252void ltt_event_position_copy(LttEventPosition *dest,
253 const LttEventPosition *src)
254{
a00149f6 255 if(src == NULL)
256 dest = NULL;
257 else
258 *dest = *src;
2a74fbf4 259}
96da5c0d 260
261
27304273 262
263LttTracefile *ltt_event_position_tracefile(LttEventPosition *ep)
264{
265 return ep->tracefile;
266}
267
6cd62ccf 268/*****************************************************************************
269 *Function name
963b5f2d 270 * ltt_event_cpu_i: get the cpu id where the event happens
6cd62ccf 271 *Input params
272 * e : an instance of an event type
273 *Return value
963b5f2d 274 * unsigned : the cpu id
6cd62ccf 275 ****************************************************************************/
276
963b5f2d 277unsigned ltt_event_cpu_id(LttEvent *e)
3aee1200 278{
279 return e->tracefile->cpu_num;
6cd62ccf 280}
281
282/*****************************************************************************
283 *Function name
284 * ltt_event_data : get the raw data for the event
285 *Input params
286 * e : an instance of an event type
287 *Return value
288 * void * : pointer to the raw data for the event
289 ****************************************************************************/
290
963b5f2d 291void *ltt_event_data(LttEvent *e)
6cd62ccf 292{
293 return e->data;
294}
295
296/*****************************************************************************
297 *Function name
298 * ltt_event_field_element_number
299 * : The number of elements in a sequence field is specific
300 * to each event. This function returns the number of
301 * elements for an array or sequence field in an event.
302 *Input params
908f42fa 303 * e : an instance of an event type
6cd62ccf 304 * f : a field of the instance
305 *Return value
306 * unsigned : the number of elements for an array/sequence field
307 ****************************************************************************/
3aee1200 308guint64 ltt_event_field_element_number(LttEvent *e, LttField *f)
6cd62ccf 309{
2312de30 310 if(f->field_type.type_class != LTT_ARRAY &&
311 f->field_type.type_class != LTT_SEQUENCE)
6cd62ccf 312 return 0;
908f42fa 313
2312de30 314 if(f->field_type.type_class == LTT_ARRAY)
315 return f->field_type.size;
316 return ltt_event_get_long_unsigned(e, &g_array_index(f->field_type.fields,
317 LttField, 0));
6cd62ccf 318}
319
320/*****************************************************************************
321 *Function name
322 * ltt_event_field_element_select
323 * : Set the currently selected element for a sequence or
324 * array field
f104d082 325 * O(1) because of offset array.
6cd62ccf 326 *Input params
908f42fa 327 * e : an instance of an event type
6cd62ccf 328 * f : a field of the instance
3aee1200 329 * i : the ith element (0, ...)
f104d082 330 *returns : the child field, at the right index, updated.
6cd62ccf 331 ****************************************************************************/
f104d082 332LttField *ltt_event_field_element_select(LttEvent *e, LttField *f, gulong i)
6cd62ccf 333{
f104d082 334 gulong element_number;
3aee1200 335 LttField *field;
8d1e6362 336 unsigned int k;
3aee1200 337 size_t size;
338 LttEventType *event_type;
f104d082 339 off_t new_offset;
908f42fa 340
2312de30 341 if(f->field_type.type_class != LTT_ARRAY &&
342 f->field_type.type_class != LTT_SEQUENCE)
743e50fd 343 return NULL;
908f42fa 344
345 element_number = ltt_event_field_element_number(e,f);
3aee1200 346 event_type = ltt_event_eventtype(e);
347 /* Sanity check for i : 0..n-1 only, and must be lower or equal element_number
8d1e6362 348 */
743e50fd 349 if(i >= element_number) return NULL;
f104d082 350
2312de30 351 if(f->field_type.type_class == LTT_ARRAY) {
352 field = &g_array_index(f->field_type.fields, LttField, 0);
f104d082 353 } else {
2312de30 354 field = &g_array_index(f->field_type.fields, LttField, 1);
f104d082 355 }
3aee1200 356
f104d082 357 if(field->field_size != 0) {
358 if(f->array_offset + (i * field->field_size) == field->offset_root)
743e50fd 359 return field; /* fixed length child, already at the right offset */
f104d082 360 else
361 new_offset = f->array_offset + (i * field->field_size);
3aee1200 362 } else {
f104d082 363 /* Var. len. child */
364 new_offset = g_array_index(f->dynamic_offsets, off_t, i);
908f42fa 365 }
743e50fd 366 compute_fields_offsets(e->tracefile,
367 ltt_event_facility(e), field, &new_offset, e->data);
f104d082 368
369 return field;
6cd62ccf 370}
371
f2923fb2 372
373off_t ltt_event_field_offset(LttEvent *e, LttField *f)
374{
375 return f->offset_root;
376}
377
378
379
6cd62ccf 380/*****************************************************************************
381 * These functions extract data from an event after architecture specific
382 * conversions
383 ****************************************************************************/
63c35f6c 384guint32 ltt_event_get_unsigned(LttEvent *e, LttField *f)
6cd62ccf 385{
f0b795e0 386 gboolean reverse_byte_order;
387 if(unlikely(f->field_type.network)) {
388 reverse_byte_order = (g_ntohs(0x1) != 0x1);
389 } else {
390 reverse_byte_order = LTT_GET_BO(e->tracefile);
391 }
392
64714253 393 switch(f->field_size) {
394 case 1:
395 {
396 guint8 x = *(guint8 *)(e->data + f->offset_root);
397 return (guint32) x;
398 }
399 break;
400 case 2:
0f7f40c1 401 return (guint32)ltt_get_uint16(reverse_byte_order, e->data + f->offset_root);
64714253 402 break;
403 case 4:
0f7f40c1 404 return (guint32)ltt_get_uint32(reverse_byte_order, e->data + f->offset_root);
64714253 405 break;
406 case 8:
407 default:
408 g_critical("ltt_event_get_unsigned : field size %i unknown", f->field_size);
409 return 0;
410 break;
63c35f6c 411 }
6cd62ccf 412}
413
63c35f6c 414gint32 ltt_event_get_int(LttEvent *e, LttField *f)
6cd62ccf 415{
f0b795e0 416 gboolean reverse_byte_order;
417 if(unlikely(f->field_type.network)) {
418 reverse_byte_order = (g_ntohs(0x1) != 0x1);
419 } else {
420 reverse_byte_order = LTT_GET_BO(e->tracefile);
421 }
422
64714253 423 switch(f->field_size) {
424 case 1:
425 {
426 gint8 x = *(gint8 *)(e->data + f->offset_root);
427 return (gint32) x;
428 }
429 break;
430 case 2:
0f7f40c1 431 return (gint32)ltt_get_int16(reverse_byte_order, e->data + f->offset_root);
64714253 432 break;
433 case 4:
0f7f40c1 434 return (gint32)ltt_get_int32(reverse_byte_order, e->data + f->offset_root);
64714253 435 break;
436 case 8:
437 default:
438 g_critical("ltt_event_get_int : field size %i unknown", f->field_size);
439 return 0;
440 break;
63c35f6c 441 }
6cd62ccf 442}
443
63c35f6c 444guint64 ltt_event_get_long_unsigned(LttEvent *e, LttField *f)
6cd62ccf 445{
f0b795e0 446 gboolean reverse_byte_order;
447 if(unlikely(f->field_type.network)) {
448 reverse_byte_order = (g_ntohs(0x1) != 0x1);
449 } else {
450 reverse_byte_order = LTT_GET_BO(e->tracefile);
451 }
64714253 452
453 switch(f->field_size) {
454 case 1:
455 {
456 guint8 x = *(guint8 *)(e->data + f->offset_root);
457 return (guint64) x;
458 }
459 break;
460 case 2:
0f7f40c1 461 return (guint64)ltt_get_uint16(reverse_byte_order, e->data + f->offset_root);
64714253 462 break;
463 case 4:
0f7f40c1 464 return (guint64)ltt_get_uint32(reverse_byte_order, e->data + f->offset_root);
64714253 465 break;
466 case 8:
0f7f40c1 467 return ltt_get_uint64(reverse_byte_order, e->data + f->offset_root);
64714253 468 break;
469 default:
470 g_critical("ltt_event_get_long_unsigned : field size %i unknown", f->field_size);
471 return 0;
472 break;
6cd62ccf 473 }
474}
475
63c35f6c 476gint64 ltt_event_get_long_int(LttEvent *e, LttField *f)
6cd62ccf 477{
f0b795e0 478 gboolean reverse_byte_order;
479 if(unlikely(f->field_type.network)) {
480 reverse_byte_order = (g_ntohs(0x1) != 0x1);
481 } else {
482 reverse_byte_order = LTT_GET_BO(e->tracefile);
483 }
64714253 484
485 switch(f->field_size) {
486 case 1:
487 {
488 gint8 x = *(gint8 *)(e->data + f->offset_root);
489 return (gint64) x;
490 }
491 break;
492 case 2:
0f7f40c1 493 return (gint64)ltt_get_int16(reverse_byte_order, e->data + f->offset_root);
64714253 494 break;
495 case 4:
0f7f40c1 496 return (gint64)ltt_get_int32(reverse_byte_order, e->data + f->offset_root);
64714253 497 break;
498 case 8:
0f7f40c1 499 return ltt_get_int64(reverse_byte_order, e->data + f->offset_root);
64714253 500 break;
501 default:
502 g_critical("ltt_event_get_long_int : field size %i unknown", f->field_size);
503 return 0;
504 break;
6cd62ccf 505 }
506}
507
963b5f2d 508float ltt_event_get_float(LttEvent *e, LttField *f)
6cd62ccf 509{
f0b795e0 510 gboolean reverse_byte_order;
511 if(unlikely(f->field_type.network)) {
512 reverse_byte_order = (g_ntohs(0x1) != 0x1);
513 } else {
514 g_assert(LTT_HAS_FLOAT(e->tracefile));
515 reverse_byte_order = LTT_GET_FLOAT_BO(e->tracefile);
516 }
6cd62ccf 517
2312de30 518 g_assert(f->field_type.type_class == LTT_FLOAT && f->field_size == 4);
6cd62ccf 519
0f7f40c1 520 if(reverse_byte_order == 0) return *(float *)(e->data + f->offset_root);
6cd62ccf 521 else{
d4214418 522 void *ptr = e->data + f->offset_root;
fadf7e8b 523 guint32 value = bswap_32(*(guint32*)ptr);
524 return *(float*)&value;
6cd62ccf 525 }
526}
527
963b5f2d 528double ltt_event_get_double(LttEvent *e, LttField *f)
6cd62ccf 529{
f0b795e0 530 gboolean reverse_byte_order;
531 if(unlikely(f->field_type.network)) {
532 reverse_byte_order = (g_ntohs(0x1) != 0x1);
533 } else {
534 g_assert(LTT_HAS_FLOAT(e->tracefile));
535 reverse_byte_order = LTT_GET_FLOAT_BO(e->tracefile);
536 }
6cd62ccf 537
2312de30 538 if(f->field_size == 4)
539 return ltt_event_get_float(e, f);
540
541 g_assert(f->field_type.type_class == LTT_FLOAT && f->field_size == 8);
6cd62ccf 542
0f7f40c1 543 if(reverse_byte_order == 0) return *(double *)(e->data + f->offset_root);
3b10b765 544 else {
d4214418 545 void *ptr = e->data + f->offset_root;
fadf7e8b 546 guint64 value = bswap_64(*(guint64*)ptr);
547 return *(double*)&value;
6cd62ccf 548 }
549}
550
551/*****************************************************************************
552 * The string obtained is only valid until the next read from
908f42fa 553 * the same tracefile.
6cd62ccf 554 ****************************************************************************/
963b5f2d 555char *ltt_event_get_string(LttEvent *e, LttField *f)
6cd62ccf 556{
2312de30 557 g_assert(f->field_type.type_class == LTT_STRING);
2a74fbf4 558
45e14832 559 return (gchar*)g_strdup((gchar*)(e->data + f->offset_root));
6cd62ccf 560}
eed2ef37 561
f104d082 562/*****************************************************************************
563 *Function name
564 * compute_fields_offsets : set the precomputable offset of the fields
565 *Input params
743e50fd 566 * fac : facility
f104d082 567 * field : the field
568 * offset : pointer to the current offset, must be incremented
569 ****************************************************************************/
570
571
743e50fd 572void compute_fields_offsets(LttTracefile *tf,
573 LttFacility *fac, LttField *field, off_t *offset, void *root)
f104d082 574{
2312de30 575 LttType *type = &field->field_type;
f104d082 576
577 switch(type->type_class) {
578 case LTT_INT_FIXED:
579 case LTT_UINT_FIXED:
580 case LTT_POINTER:
581 case LTT_CHAR:
582 case LTT_UCHAR:
583 case LTT_SHORT:
584 case LTT_USHORT:
585 case LTT_INT:
586 case LTT_UINT:
587 case LTT_LONG:
588 case LTT_ULONG:
589 case LTT_SIZE_T:
590 case LTT_SSIZE_T:
591 case LTT_OFF_T:
592 case LTT_FLOAT:
593 case LTT_ENUM:
594 if(field->fixed_root == FIELD_VARIABLE) {
595 /* Align offset on type size */
743e50fd 596 *offset += ltt_align(*offset, get_alignment(field),
597 fac->alignment);
f104d082 598 /* remember offset */
599 field->offset_root = *offset;
600 /* Increment offset */
601 *offset += field->field_size;
743e50fd 602 } else {
603 //g_debug("type before offset : %llu %llu %u\n", *offset,
604 // field->offset_root,
605 // field->field_size);
606 *offset = field->offset_root;
607 *offset += field->field_size;
608 //g_debug("type after offset : %llu\n", *offset);
f104d082 609 }
f104d082 610 break;
611 case LTT_STRING:
612 if(field->fixed_root == FIELD_VARIABLE) {
613 field->offset_root = *offset;
614 }
615 *offset += strlen((gchar*)(root+*offset)) + 1;
743e50fd 616 /* Realign the data */
617 *offset += ltt_align(*offset, fac->pointer_size,
618 fac->alignment);
f104d082 619 break;
620 case LTT_ARRAY:
621 g_assert(type->fields->len == 1);
622 {
623 off_t local_offset;
624 LttField *child = &g_array_index(type->fields, LttField, 0);
625 if(field->fixed_root == FIELD_VARIABLE) {
743e50fd 626 *offset += ltt_align(*offset, get_alignment(field),
627 fac->alignment);
f104d082 628 /* remember offset */
629 field->offset_root = *offset;
630 field->array_offset = *offset;
631 }
632
633 if(field->field_size != 0) {
634 /* Increment offset */
635 /* field_size is the array size in bytes */
636 *offset = field->offset_root + field->field_size;
637 } else {
638 guint i;
639 *offset = field->array_offset;
640 field->dynamic_offsets = g_array_set_size(field->dynamic_offsets,
641 0);
642 for(i=0; i<type->size; i++) {
643 g_array_append_val(field->dynamic_offsets, *offset);
743e50fd 644 compute_fields_offsets(tf, fac, child, offset, root);
f104d082 645 }
646 }
647 // local_offset = field->array_offset;
648 // /* Set the offset at position 0 */
743e50fd 649 // compute_fields_offsets(tf, fac, child, &local_offset, root);
2312de30 650 }
651 break;
f104d082 652 case LTT_SEQUENCE:
653 g_assert(type->fields->len == 2);
654 {
655 off_t local_offset;
656 LttField *child;
657 guint i;
743e50fd 658 guint num_elem;
f104d082 659 if(field->fixed_root == FIELD_VARIABLE) {
743e50fd 660 *offset += ltt_align(*offset, get_alignment(field),
661 fac->alignment);
f104d082 662 /* remember offset */
663 field->offset_root = *offset;
664
665 child = &g_array_index(type->fields, LttField, 0);
743e50fd 666 compute_fields_offsets(tf, fac, child, offset, root);
f104d082 667 child = &g_array_index(type->fields, LttField, 1);
743e50fd 668 *offset += ltt_align(*offset, get_alignment(child),
669 fac->alignment);
f104d082 670 field->array_offset = *offset;
671
672 } else {
673 child = &g_array_index(type->fields, LttField, 1);
674 }
675 *offset = field->array_offset;
676 field->dynamic_offsets = g_array_set_size(field->dynamic_offsets,
677 0);
743e50fd 678 num_elem = ltt_event_field_element_number(&tf->event, field);
679 for(i=0; i<num_elem; i++) {
f104d082 680 g_array_append_val(field->dynamic_offsets, *offset);
743e50fd 681 compute_fields_offsets(tf, fac, child, offset, root);
f104d082 682 }
743e50fd 683 g_assert(num_elem == field->dynamic_offsets->len);
684
685 /* Realign the data */
686 *offset += ltt_align(*offset, fac->pointer_size,
687 fac->alignment);
688
f104d082 689 // local_offset = field->array_offset;
690 // /* Set the offset at position 0 */
743e50fd 691 // compute_fields_offsets(tf, fac, child, &local_offset, root);
f104d082 692 }
693 break;
694 case LTT_STRUCT:
695 {
696 LttField *child;
697 guint i;
698 gint ret=0;
699 if(field->fixed_root == FIELD_VARIABLE) {
83e160f2 700 *offset += ltt_align(*offset, get_alignment(field),
743e50fd 701 fac->alignment);
f104d082 702 /* remember offset */
703 field->offset_root = *offset;
704 } else {
705 *offset = field->offset_root;
706 }
707 for(i=0; i<type->fields->len; i++) {
708 child = &g_array_index(type->fields, LttField, i);
743e50fd 709 compute_fields_offsets(tf, fac, child, offset, root);
f104d082 710 }
711 }
712 break;
713 case LTT_UNION:
714 {
715 LttField *child;
716 guint i;
717 gint ret=0;
718 if(field->fixed_root == FIELD_VARIABLE) {
743e50fd 719 *offset += ltt_align(*offset, get_alignment(field),
720 fac->alignment);
f104d082 721 /* remember offset */
722 field->offset_root = *offset;
723 }
724 for(i=0; i<type->fields->len; i++) {
725 *offset = field->offset_root;
726 child = &g_array_index(type->fields, LttField, i);
743e50fd 727 compute_fields_offsets(tf, fac, child, offset, root);
f104d082 728 }
729 *offset = field->offset_root + field->field_size;
730 }
731 break;
732 case LTT_NONE:
733 default:
734 g_error("compute_fields_offsets : unknown type");
735 }
736
737}
eed2ef37 738
739
f104d082 740/*****************************************************************************
741 *Function name
742 * compute_offsets : set the dynamically computable offsets of an event type
743 *Input params
744 * tf : tracefile
745 * event : event type
746 *
747 ****************************************************************************/
743e50fd 748void compute_offsets(LttTracefile *tf, LttFacility *fac,
749 LttEventType *event, off_t *offset, void *root)
f104d082 750{
751 guint i;
f104d082 752
753 /* compute all variable offsets */
754 for(i=0; i<event->fields->len; i++) {
743e50fd 755 //g_debug("computing offset %u of %u\n", i, event->fields->len-1);
f104d082 756 LttField *field = &g_array_index(event->fields, LttField, i);
743e50fd 757 compute_fields_offsets(tf, fac, field, offset, root);
f104d082 758 }
759
760}
761
This page took 0.09101 seconds and 4 git commands to generate.