Add Full heartbeat support
[lttv.git] / ltt / branches / poly / ltt / facility.c
CommitLineData
449cb9d7 1/* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2003-2004 Xiangxiu Yang
3aee1200 3 * 2005 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 <stdlib.h>
25#include <string.h>
26#include <stdio.h>
cdf90f40 27#include <glib.h>
45e14832 28#include <sys/types.h>
29#include <sys/stat.h>
30#include <fcntl.h>
31
32
6cd62ccf 33
6cd62ccf 34#include "parser.h"
a5dcde2f 35#include <ltt/ltt.h>
36#include "ltt-private.h"
6cd62ccf 37#include <ltt/facility.h>
38
86005ded 39#ifndef g_open
40#define g_open open
41#endif
42
45e14832 43#define g_close close
44
6cd62ccf 45/* search for the (named) type in the table, if it does not exist
46 create a new one */
90699b2b 47LttType * lookup_named_type(LttFacility *fac, type_descriptor_t * td);
6cd62ccf 48
49/* construct directed acyclic graph for types, and tree for fields */
2312de30 50void construct_fields(LttFacility *fac,
c1161b10 51 LttField *field,
2312de30 52 field_t *fld);
6cd62ccf 53
54/* generate the facility according to the events belongin to it */
8d1e6362 55void generateFacility(LttFacility * f, facility_t * fac,
3aee1200 56 guint32 checksum);
6cd62ccf 57
58/* functions to release the memory occupied by a facility */
963b5f2d 59void freeFacility(LttFacility * facility);
60void freeEventtype(LttEventType * evType);
2312de30 61void freeLttType(LttType * type);
963b5f2d 62void freeLttField(LttField * fld);
908f42fa 63void freeLttNamedType(LttType * type);
6cd62ccf 64
65
66/*****************************************************************************
67 *Function name
963b5f2d 68 * ltt_facility_open : open facilities
6cd62ccf 69 *Input params
963b5f2d 70 * t : the trace containing the facilities
6cd62ccf 71 * pathname : the path name of the facility
3aee1200 72 *
29e7c5b3 73 * Open the facility corresponding to the right checksum.
74 *
3aee1200 75 *returns 0 on success, 1 on error.
6cd62ccf 76 ****************************************************************************/
77
3aee1200 78int ltt_facility_open(LttFacility *f, LttTrace * t, gchar * pathname)
6cd62ccf 79{
a0c1f622 80 int ret = 0;
45e14832 81 gchar *token;
90699b2b 82 parse_file_t in;
8d1e6362 83 facility_t * fac;
2312de30 84 unsigned int checksum;
45e14832 85 gchar buffer[BUFFER_SIZE];
29e7c5b3 86 gboolean generated = FALSE;
6cd62ccf 87
45e14832 88 in.buffer = &(buffer[0]);
6cd62ccf 89 in.lineno = 0;
90 in.error = error_callback;
963b5f2d 91 in.name = pathname;
ba8a51cd 92 in.unget = 0;
6cd62ccf 93
90699b2b 94 in.fp = fopen(in.name, "r");
cb03932a 95 if(in.fp == NULL) {
3aee1200 96 g_warning("cannot open facility description file %s",
97 in.name);
a0c1f622 98 ret = 1;
99 goto open_error;
3aee1200 100 }
45e14832 101
6cd62ccf 102 while(1){
103 token = getToken(&in);
104 if(in.type == ENDFILE) break;
e6d018d4 105
c1161b10 106 if(g_ascii_strcasecmp(token, "<")) in.error(&in,"not a facility file");
107 token = getName(&in);
108 if(g_ascii_strcasecmp(token, "?")) in.error(&in,"not a facility file");
109 token = getName(&in);
110 if(g_ascii_strcasecmp(token, "xml")) in.error(&in,"not a facility file");
111 token = getName(&in);
112 if(g_ascii_strcasecmp(token, "version")) in.error(&in,"not a facility file");
113 token = getName(&in);
114 if(g_ascii_strcasecmp(token, "=")) in.error(&in,"not a facility file");
115 token = getQuotedString(&in);
116 if(g_ascii_strcasecmp(token, "1.0")) in.error(&in,"not a facility file");
117 token = getName(&in);
118 if(g_ascii_strcasecmp(token, "?")) in.error(&in,"not a facility file");
119 token = getToken(&in);
120 if(g_ascii_strcasecmp(token, ">")) in.error(&in,"not a facility file");
121
122 token = getToken(&in);
123
45e14832 124 if(g_ascii_strcasecmp(token, "<")) in.error(&in,"not a facility file");
963b5f2d 125 token = getName(&in);
45e14832 126
127 if(g_ascii_strcasecmp("facility",token) == 0) {
8d1e6362 128 fac = g_new(facility_t, 1);
963b5f2d 129 fac->name = NULL;
130 fac->description = NULL;
131 sequence_init(&(fac->events));
132 table_init(&(fac->named_types));
133 sequence_init(&(fac->unnamed_types));
134
135 parseFacility(&in, fac);
136
137 //check if any namedType is not defined
90699b2b 138 checkNamedTypesImplemented(&fac->named_types);
963b5f2d 139
90699b2b 140 generateChecksum(fac->name, &checksum, &fac->events);
29e7c5b3 141 if(checksum == f->checksum) {
142 generateFacility(f, fac, checksum);
143 generated = TRUE;
144 }
963b5f2d 145
45e14832 146 g_free(fac->name);
d2ace3a9 147 free(fac->capname);
45e14832 148 g_free(fac->description);
963b5f2d 149 freeEvents(&fac->events);
150 sequence_dispose(&fac->events);
151 freeNamedType(&fac->named_types);
152 table_dispose(&fac->named_types);
153 freeTypes(&fac->unnamed_types);
154 sequence_dispose(&fac->unnamed_types);
cf1307af 155 g_free(fac);
129fd24a 156 if(generated) break; /* use the first good match */
6cd62ccf 157 }
3aee1200 158 else {
159 g_warning("facility token was expected in file %s", in.name);
a0c1f622 160 ret = 1;
3aee1200 161 goto parse_error;
162 }
6cd62ccf 163 }
29e7c5b3 164
3aee1200 165 parse_error:
90699b2b 166 fclose(in.fp);
a0c1f622 167open_error:
90699b2b 168
986e2a7c 169 if(!generated) {
170 g_warning("Cannot find facility %s, checksum 0x%X",
171 g_quark_to_string(f->name), f->checksum);
172 ret = 1;
173 }
29e7c5b3 174
a0c1f622 175 return ret;
6cd62ccf 176}
177
178
179/*****************************************************************************
180 *Function name
181 * generateFacility : generate facility, internal function
182 *Input params
963b5f2d 183 * facility : LttFacilty structure
184 * fac : facility structure
6cd62ccf 185 * checksum : checksum of the facility
6cd62ccf 186 ****************************************************************************/
187
3aee1200 188void generateFacility(LttFacility *f, facility_t *fac, guint32 checksum)
6cd62ccf 189{
963b5f2d 190 char * facilityName = fac->name;
90699b2b 191 sequence_t * events = &fac->events;
f104d082 192 unsigned int i, j;
963b5f2d 193 LttType * type;
f104d082 194 table_t *named_types = &fac->named_types;
6cd62ccf 195
3aee1200 196 g_assert(f->name == g_quark_from_string(facilityName));
197 g_assert(f->checksum == checksum);
198
199 //f->event_number = events->position;
6cd62ccf 200
201 //initialize inner structures
3aee1200 202 f->events = g_array_sized_new (FALSE, TRUE, sizeof(LttEventType),
203 events->position);
204 //f->events = g_new(LttEventType*,f->event_number);
205 f->events = g_array_set_size(f->events, events->position);
206
207 g_datalist_init(&f->events_by_name);
2312de30 208 // g_datalist_init(&f->named_types);
f104d082 209#if 0
210 /* The first day, he created the named types */
211
212 for(i=0; i<named_types->keys.position; i++) {
213 GQuark name = g_quark_from_string((char*)named_types->keys.array[i]);
214 type_descriptor_t *td = (type_descriptor_t*)named_types->values.array[i];
215
216 /* Create the type */
217 type = g_new(LttType,1);
218 type->type_name = name;
219 type->type_class = td->type;
220 if(td->fmt) type->fmt = g_strdup(td->fmt);
221 else type->fmt = NULL;
222 type->size = td->size;
223 type->enum_strings = NULL;
224 type->element_type = NULL;
225 type->element_number = 0;
226
227 construct_types_and_fields(type, td, NULL, NULL, ...);
228
229 g_datalist_id_set_data_full(&fac->named_types, name,
230 type, (GDestroyNotify)freeLttNamedType);
231
232 }
233#endif //0
234 /* The second day, he created the event fields and types */
235 //for each event, construct field and type acyclic graph
6cd62ccf 236 for(i=0;i<events->position;i++){
c1161b10 237 event_t *parser_event = (event_t*)events->array[i];
f104d082 238 LttEventType *event_type = &g_array_index(f->events, LttEventType, i);
6cd62ccf 239
3aee1200 240 event_type->name =
f104d082 241 g_quark_from_string(parser_event->name);
3aee1200 242
243 g_datalist_id_set_data(&f->events_by_name, event_type->name,
244 event_type);
245
246 event_type->description =
f104d082 247 g_strdup(parser_event->description);
6cd62ccf 248
3aee1200 249 event_type->index = i;
f104d082 250 event_type->facility = f;
6cd62ccf 251
f104d082 252 event_type->fields = g_array_sized_new(FALSE, TRUE,
253 sizeof(LttField), parser_event->fields.position);
254 event_type->fields =
255 g_array_set_size(event_type->fields, parser_event->fields.position);
256 g_datalist_init(&event_type->fields_by_name);
257
258 for(j=0; j<parser_event->fields.position; j++) {
259 LttField *field = &g_array_index(event_type->fields, LttField, j);
260 field_t *parser_field = (field_t*)parser_event->fields.array[j];
261
2312de30 262 construct_fields(f, field, parser_field);
f104d082 263 g_datalist_id_set_data(&event_type->fields_by_name,
264 field->name,
265 field);
8710c6c7 266 }
f104d082 267 }
268
269 /* What about 2 days weeks ? */
6cd62ccf 270}
271
272
273/*****************************************************************************
274 *Function name
3aee1200 275 * construct_types_and_fields : construct field tree and type graph,
6cd62ccf 276 * internal recursion function
277 *Input params
278 * fac : facility struct
f104d082 279 * field : destination lttv field
280 * fld : source parser field
6cd62ccf 281 ****************************************************************************/
282
f104d082 283//DONE
284//make the change for arrays and sequences
285//no more root field. -> change this for an array of fields.
286// Compute the field size here.
287// Flag fields as "VARIABLE OFFSET" or "FIXED OFFSET" : as soon as
288// a field with a variable size is found, all the following fields must
289// be flagged with "VARIABLE OFFSET", this will be done by the offset
290// precomputation.
291
3aee1200 292
f104d082 293void construct_fields(LttFacility *fac,
c1161b10 294 LttField *field,
f104d082 295 field_t *fld)
296{
297 guint len;
298 type_descriptor_t *td;
2312de30 299 LttType *type;
f104d082 300
c1161b10 301 if(fld->name)
302 field->name = g_quark_from_string(fld->name);
303 else
304 fld->name = 0;
ae3d0f50 305
f104d082 306 if(fld->description) {
307 len = strlen(fld->description);
308 field->description = g_new(gchar, len+1);
309 strcpy(field->description, fld->description);
310 }
311 field->dynamic_offsets = NULL;
312 type = &field->field_type;
313 td = fld->type;
314
315 type->enum_map = NULL;
316 type->fields = NULL;
317 type->fields_by_name = NULL;
c1161b10 318 type->network = td->network;
743e50fd 319
f104d082 320 switch(td->type) {
321 case INT_FIXED:
322 type->type_class = LTT_INT_FIXED;
323 type->size = td->size;
324 break;
325 case UINT_FIXED:
326 type->type_class = LTT_UINT_FIXED;
327 type->size = td->size;
328 break;
329 case POINTER:
330 type->type_class = LTT_POINTER;
331 type->size = fac->pointer_size;
332 break;
333 case CHAR:
334 type->type_class = LTT_CHAR;
335 type->size = td->size;
336 break;
337 case UCHAR:
338 type->type_class = LTT_UCHAR;
339 type->size = td->size;
743e50fd 340 g_assert(type->size != 0);
f104d082 341 break;
342 case SHORT:
343 type->type_class = LTT_SHORT;
344 type->size = td->size;
345 break;
346 case USHORT:
347 type->type_class = LTT_USHORT;
348 type->size = td->size;
349 break;
350 case INT:
351 type->type_class = LTT_INT;
352 type->size = fac->int_size;
353 break;
354 case UINT:
355 type->type_class = LTT_UINT;
356 type->size = fac->int_size;
743e50fd 357 g_assert(type->size != 0);
f104d082 358 break;
359 case LONG:
360 type->type_class = LTT_LONG;
361 type->size = fac->long_size;
362 break;
363 case ULONG:
364 type->type_class = LTT_ULONG;
365 type->size = fac->long_size;
366 break;
367 case SIZE_T:
368 type->type_class = LTT_SIZE_T;
369 type->size = fac->size_t_size;
370 break;
371 case SSIZE_T:
372 type->type_class = LTT_SSIZE_T;
373 type->size = fac->size_t_size;
374 break;
375 case OFF_T:
376 type->type_class = LTT_OFF_T;
377 type->size = fac->size_t_size;
378 break;
379 case FLOAT:
380 type->type_class = LTT_FLOAT;
381 type->size = td->size;
382 break;
383 case STRING:
384 type->type_class = LTT_STRING;
385 type->size = 0;
386 break;
387 case ENUM:
388 type->type_class = LTT_ENUM;
389 type->size = fac->int_size;
390 {
391 guint i;
743e50fd 392 type->enum_map = g_hash_table_new(g_direct_hash, g_direct_equal);
f104d082 393 for(i=0; i<td->labels.position; i++) {
2312de30 394 GQuark value = g_quark_from_string((char*)td->labels.array[i]);
395 gint key = *(int*)td->labels_values.array[i];
396 g_hash_table_insert(type->enum_map, (gpointer)key, (gpointer)value);
f104d082 397 }
398 }
743e50fd 399 g_assert(type->size != 0);
f104d082 400 break;
401 case ARRAY:
402 type->type_class = LTT_ARRAY;
403 type->size = td->size;
404 type->fields = g_array_sized_new(FALSE, TRUE, sizeof(LttField),
405 td->fields.position);
406 type->fields = g_array_set_size(type->fields, td->fields.position);
407 {
408 guint i;
409
410 for(i=0; i<td->fields.position; i++) {
411 field_t *schild = (field_t*)td->fields.array[i];
412 LttField *dchild = &g_array_index(type->fields, LttField, i);
413
414 construct_fields(fac, dchild, schild);
415 }
416 }
417 break;
418 case SEQUENCE:
419 type->type_class = LTT_SEQUENCE;
420 type->size = 0;
421 type->fields = g_array_sized_new(FALSE, TRUE, sizeof(LttField),
422 td->fields.position);
423 type->fields = g_array_set_size(type->fields, td->fields.position);
424 {
425 guint i;
426
427 for(i=0; i<td->fields.position; i++) {
428 field_t *schild = (field_t*)td->fields.array[i];
429 LttField *dchild = &g_array_index(type->fields, LttField, i);
430
431 construct_fields(fac, dchild, schild);
432 }
433 }
434 break;
435 case STRUCT:
436 type->type_class = LTT_STRUCT;
437 type->size = 0; // Size not calculated by the parser.
438 type->fields = g_array_sized_new(FALSE, TRUE, sizeof(LttField),
439 td->fields.position);
440 type->fields = g_array_set_size(type->fields, td->fields.position);
441 g_datalist_init(&type->fields_by_name);
442 {
443 guint i;
444
445 for(i=0; i<td->fields.position; i++) {
446 field_t *schild = (field_t*)td->fields.array[i];
447 LttField *dchild = &g_array_index(type->fields, LttField, i);
448
449 construct_fields(fac, dchild, schild);
450 g_datalist_id_set_data(&type->fields_by_name,
451 dchild->name,
452 dchild);
453 }
454 }
455 break;
456 case UNION:
457 type->type_class = LTT_UNION;
458 type->size = 0; // Size not calculated by the parser.
459 type->fields = g_array_sized_new(FALSE, TRUE, sizeof(LttField),
460 td->fields.position);
461 type->fields = g_array_set_size(type->fields, td->fields.position);
462 g_datalist_init(&type->fields_by_name);
463 {
464 guint i;
465
466 for(i=0; i<td->fields.position; i++) {
467 field_t *schild = (field_t*)td->fields.array[i];
468 LttField *dchild = &g_array_index(type->fields, LttField, i);
469
470 construct_fields(fac, dchild, schild);
471 g_datalist_id_set_data(&type->fields_by_name,
472 dchild->name,
473 dchild);
474 }
475 }
476 break;
477 case NONE:
478 default:
479 g_error("construct_fields : unknown type");
480 }
481
482 field->field_size = type->size;
483
484 /* Put the fields as "variable" offset to root first. Then,
485 * the offset precomputation will only have to set the FIELD_FIXED until
486 * it reaches the first variable length field, then stop.
487 */
488 field->fixed_root = FIELD_VARIABLE;
489
490 if(td->fmt) {
491 len = strlen(td->fmt);
492 type->fmt = g_new(gchar, len+1);
493 strcpy(type->fmt, td->fmt);
494 }
495}
496
497
498
499#if 0
90699b2b 500void construct_types_and_fields(LttFacility * fac, type_descriptor_t * td,
3aee1200 501 LttField * fld)
502{
a0c1f622 503 int i;
90699b2b 504 type_descriptor_t * tmpTd;
3aee1200 505
506 switch(td->type) {
cb03932a 507 case INT:
508 case UINT:
509 case FLOAT:
510 fld->field_type->size = td->size;
511 break;
512 case POINTER:
513 case LONG:
514 case ULONG:
515 case SIZE_T:
516 case SSIZE_T:
517 case OFF_T:
518 fld->field_type->size = 0;
519 break;
520 case STRING:
521 fld->field_type->size = 0;
522 break;
523 case ENUM:
524 fld->field_type->element_number = td->labels.position;
525 fld->field_type->enum_strings = g_new(GQuark,td->labels.position);
526 for(i=0;i<td->labels.position;i++){
527 fld->field_type->enum_strings[i]
528 = g_quark_from_string(((char*)(td->labels.array[i])));
529 }
530 fld->field_type->size = td->size;
531 break;
532
533 case ARRAY:
534 fld->field_type->element_number = (unsigned)td->size;
535 case SEQUENCE:
3aee1200 536 fld->field_type->element_type = g_new(LttType*,1);
537 tmpTd = td->nested_type;
538 fld->field_type->element_type[0] = lookup_named_type(fac, tmpTd);
539 fld->child = g_new(LttField*, 1);
540 fld->child[0] = g_new(LttField, 1);
541
542 fld->child[0]->field_type = fld->field_type->element_type[0];
543 fld->child[0]->offset_root = 0;
544 fld->child[0]->fixed_root = FIELD_UNKNOWN;
545 fld->child[0]->offset_parent = 0;
546 fld->child[0]->fixed_parent = FIELD_UNKNOWN;
547 fld->child[0]->field_size = 0;
548 fld->child[0]->fixed_size = FIELD_UNKNOWN;
549 fld->child[0]->parent = fld;
550 fld->child[0]->child = NULL;
551 fld->child[0]->current_element = 0;
552 construct_types_and_fields(fac, tmpTd, fld->child[0]);
553 break;
cb03932a 554
555 case STRUCT:
556 case UNION:
3aee1200 557 fld->field_type->element_number = td->fields.position;
558
559 g_assert(fld->field_type->element_type == NULL);
560 fld->field_type->element_type = g_new(LttType*, td->fields.position);
561
562 fld->child = g_new(LttField*, td->fields.position);
563 for(i=0;i<td->fields.position;i++){
90699b2b 564 tmpTd = ((field_t*)(td->fields.array[i]))->type;
3aee1200 565
c1161b10 566 fld->field_type->element_type[i] = lookup_named_type(fac, tmpTd);
3aee1200 567 fld->child[i] = g_new(LttField,1);
568
569 // fld->child[i]->field_pos = i;
570 fld->child[i]->field_type = fld->field_type->element_type[i];
571
572 fld->child[i]->field_type->element_name
c1161b10 573 = g_quark_from_string(((field_t*)(td->fields.array[i]))->name);
3aee1200 574
575 fld->child[i]->offset_root = 0;
576 fld->child[i]->fixed_root = FIELD_UNKNOWN;
577 fld->child[i]->offset_parent = 0;
578 fld->child[i]->fixed_parent = FIELD_UNKNOWN;
579 fld->child[i]->field_size = 0;
580 fld->child[i]->fixed_size = FIELD_UNKNOWN;
581 fld->child[i]->parent = fld;
582 fld->child[i]->child = NULL;
583 fld->child[i]->current_element = 0;
584 construct_types_and_fields(fac, tmpTd, fld->child[i]);
585 }
3aee1200 586 break;
cb03932a 587
3aee1200 588 default:
589 g_error("construct_types_and_fields : unknown type");
590 }
591
592
593}
594
f104d082 595#endif //0
3aee1200 596
597#if 0
598void construct_types_and_fields(LttFacility * fac, type_descriptor * td,
963b5f2d 599 LttField * fld)
6cd62ccf 600{
908f42fa 601 int i, flag;
6cd62ccf 602 type_descriptor * tmpTd;
603
604 // if(td->type == LTT_STRING || td->type == LTT_SEQUENCE)
605 // fld->field_size = 0;
606 // else fld->field_size = -1;
607
608 if(td->type == LTT_ENUM){
609 fld->field_type->element_number = td->labels.position;
3aee1200 610 fld->field_type->enum_strings = g_new(GQuark,td->labels.position);
6cd62ccf 611 for(i=0;i<td->labels.position;i++){
612 fld->field_type->enum_strings[i]
3aee1200 613 = g_quark_from_string(((char*)(td->labels.array[i])));
6cd62ccf 614 }
615 }else if(td->type == LTT_ARRAY || td->type == LTT_SEQUENCE){
616 if(td->type == LTT_ARRAY)
617 fld->field_type->element_number = (unsigned)td->size;
963b5f2d 618 fld->field_type->element_type = g_new(LttType*,1);
6cd62ccf 619 tmpTd = td->nested_type;
620 fld->field_type->element_type[0] = lookup_named_type(fac, tmpTd);
963b5f2d 621 fld->child = g_new(LttField*, 1);
622 fld->child[0] = g_new(LttField, 1);
6cd62ccf 623
3aee1200 624// fld->child[0]->field_pos = 0;
6cd62ccf 625 fld->child[0]->field_type = fld->field_type->element_type[0];
626 fld->child[0]->offset_root = fld->offset_root;
627 fld->child[0]->fixed_root = fld->fixed_root;
628 fld->child[0]->offset_parent = 0;
629 fld->child[0]->fixed_parent = 1;
630 // fld->child[0]->base_address = NULL;
631 fld->child[0]->field_size = 0;
632 fld->child[0]->field_fixed = -1;
633 fld->child[0]->parent = fld;
634 fld->child[0]->child = NULL;
635 fld->child[0]->current_element = 0;
3aee1200 636 construct_types_and_fields(fac, tmpTd, fld->child[0]);
6cd62ccf 637 }else if(td->type == LTT_STRUCT){
638 fld->field_type->element_number = td->fields.position;
908f42fa 639
640 if(fld->field_type->element_type == NULL){
641 fld->field_type->element_type = g_new(LttType*, td->fields.position);
642 flag = 1;
643 }else{
644 flag = 0;
645 }
646
963b5f2d 647 fld->child = g_new(LttField*, td->fields.position);
6cd62ccf 648 for(i=0;i<td->fields.position;i++){
8d1e6362 649 tmpTd = ((type_fields*)(td->fields.array[i]))->type;
908f42fa 650
651 if(flag)
c1161b10 652 fld->field_type->element_type[i] = lookup_named_type(fac, tmpTd);
963b5f2d 653 fld->child[i] = g_new(LttField,1);
6cd62ccf 654
655 fld->child[i]->field_pos = i;
656 fld->child[i]->field_type = fld->field_type->element_type[i];
908f42fa 657
658 if(flag){
c1161b10 659 fld->child[i]->field_type->element_name
660 = g_quark_from_string(((type_fields*)(td->fields.array[i]))->name);
908f42fa 661 }
662
6cd62ccf 663 fld->child[i]->offset_root = -1;
664 fld->child[i]->fixed_root = -1;
665 fld->child[i]->offset_parent = -1;
666 fld->child[i]->fixed_parent = -1;
667 // fld->child[i]->base_address = NULL;
668 fld->child[i]->field_size = 0;
669 fld->child[i]->field_fixed = -1;
670 fld->child[i]->parent = fld;
671 fld->child[i]->child = NULL;
672 fld->child[i]->current_element = 0;
3aee1200 673 construct_types_and_fields(fac, tmpTd, fld->child[i]);
6cd62ccf 674 }
675 }
676}
3aee1200 677#endif //0
6cd62ccf 678
f104d082 679#if 0
6cd62ccf 680/*****************************************************************************
681 *Function name
682 * lookup_named_type: search named type in the table
683 * internal function
684 *Input params
685 * fac : facility struct
f104d082 686 * name : type name
6cd62ccf 687 *Return value
963b5f2d 688 * : either find the named type, or create a new LttType
6cd62ccf 689 ****************************************************************************/
690
f104d082 691LttType * lookup_named_type(LttFacility *fac, GQuark type_name)
6cd62ccf 692{
cb03932a 693 LttType *type = NULL;
6cd62ccf 694
f104d082 695 /* Named type */
696 type = g_datalist_id_get_data(&fac->named_types, name);
697
698 g_assert(type != NULL);
699#if 0
3aee1200 700 if(type == NULL){
cb03932a 701 /* Create the type */
3aee1200 702 type = g_new(LttType,1);
703 type->type_name = name;
3aee1200 704 type->type_class = td->type;
705 if(td->fmt) type->fmt = g_strdup(td->fmt);
706 else type->fmt = NULL;
707 type->size = td->size;
708 type->enum_strings = NULL;
709 type->element_type = NULL;
710 type->element_number = 0;
cb03932a 711
712 if(td->type_name != NULL)
713 g_datalist_id_set_data_full(&fac->named_types, name,
714 type, (GDestroyNotify)freeLttNamedType);
6cd62ccf 715 }
f104d082 716#endif //0
3aee1200 717 return type;
6cd62ccf 718}
f104d082 719#endif //0
6cd62ccf 720
721/*****************************************************************************
722 *Function name
723 * ltt_facility_close : close a facility, decrease its usage count,
724 * if usage count = 0, release the memory
725 *Input params
726 * f : facility that will be closed
6cd62ccf 727 ****************************************************************************/
728
3aee1200 729void ltt_facility_close(LttFacility *f)
6cd62ccf 730{
6cd62ccf 731 //release the memory it occupied
732 freeFacility(f);
6cd62ccf 733}
734
735/*****************************************************************************
736 * Functions to release the memory occupied by the facility
737 ****************************************************************************/
738
963b5f2d 739void freeFacility(LttFacility * fac)
6cd62ccf 740{
3aee1200 741 guint i;
742 LttEventType *et;
6cd62ccf 743
3aee1200 744 for(i=0; i<fac->events->len; i++) {
745 et = &g_array_index (fac->events, LttEventType, i);
746 freeEventtype(et);
6cd62ccf 747 }
3aee1200 748 g_array_free(fac->events, TRUE);
6cd62ccf 749
f104d082 750 g_datalist_clear(&fac->events_by_name);
6cd62ccf 751
f104d082 752 // g_datalist_clear(&fac->named_types);
6cd62ccf 753}
754
963b5f2d 755void freeEventtype(LttEventType * evType)
6cd62ccf 756{
f104d082 757 unsigned int i;
908f42fa 758 LttType * root_type;
6cd62ccf 759 if(evType->description)
f104d082 760 g_free(evType->description);
761
762 for(i=0; i<evType->fields->len;i++) {
2312de30 763 LttField *field = &g_array_index(evType->fields, LttField, i);
764 freeLttField(field);
1417d990 765 }
f104d082 766 g_array_free(evType->fields, TRUE);
767 g_datalist_clear(&evType->fields_by_name);
768}
769
770void freeLttType(LttType * type)
771{
772 unsigned int i;
773
774 if(type->fmt)
775 g_free(type->fmt);
776
777 if(type->enum_map)
2312de30 778 g_hash_table_destroy(type->enum_map);
f104d082 779
780 if(type->fields) {
781 for(i=0; i<type->fields->len; i++) {
782 freeLttField(&g_array_index(type->fields, LttField, i));
783 }
784 g_array_free(type->fields, TRUE);
785 }
786 if(type->fields_by_name)
787 g_datalist_clear(&type->fields_by_name);
6cd62ccf 788}
789
908f42fa 790void freeLttNamedType(LttType * type)
791{
f104d082 792 freeLttType(type);
908f42fa 793}
794
f104d082 795void freeLttField(LttField * field)
1417d990 796{
f104d082 797 if(field->description)
798 g_free(field->description);
799 if(field->dynamic_offsets)
800 g_array_free(field->dynamic_offsets, TRUE);
2312de30 801 freeLttType(&field->field_type);
6cd62ccf 802}
803
804/*****************************************************************************
805 *Function name
806 * ltt_facility_name : obtain the facility's name
807 *Input params
3aee1200 808 * f : the facility
6cd62ccf 809 *Return value
3aee1200 810 * GQuark : the facility's name
6cd62ccf 811 ****************************************************************************/
812
3aee1200 813GQuark ltt_facility_name(LttFacility *f)
6cd62ccf 814{
815 return f->name;
816}
817
818/*****************************************************************************
819 *Function name
820 * ltt_facility_checksum : obtain the facility's checksum
821 *Input params
3aee1200 822 * f : the facility
6cd62ccf 823 *Return value
3aee1200 824 * : the checksum of the facility
6cd62ccf 825 ****************************************************************************/
826
3aee1200 827guint32 ltt_facility_checksum(LttFacility *f)
6cd62ccf 828{
829 return f->checksum;
830}
831
963b5f2d 832/*****************************************************************************
833 *Function name
834 * ltt_facility_base_id : obtain the facility base id
835 *Input params
836 * f : the facility
837 *Return value
838 * : the base id of the facility
839 ****************************************************************************/
840
3aee1200 841guint ltt_facility_id(LttFacility *f)
963b5f2d 842{
3aee1200 843 return f->id;
963b5f2d 844}
845
6cd62ccf 846/*****************************************************************************
847 *Function name
848 * ltt_facility_eventtype_number: obtain the number of the event types
849 *Input params
850 * f : the facility that will be closed
851 *Return value
3aee1200 852 * : the number of the event types
6cd62ccf 853 ****************************************************************************/
854
3aee1200 855guint8 ltt_facility_eventtype_number(LttFacility *f)
6cd62ccf 856{
3aee1200 857 return (f->events->len);
6cd62ccf 858}
859
860/*****************************************************************************
861 *Function name
862 * ltt_facility_eventtype_get: obtain the event type according to event id
863 * from 0 to event_number - 1
864 *Input params
865 * f : the facility that will be closed
866 *Return value
963b5f2d 867 * LttEventType * : the event type required
6cd62ccf 868 ****************************************************************************/
869
3aee1200 870LttEventType *ltt_facility_eventtype_get(LttFacility *f, guint8 i)
6cd62ccf 871{
c4afd5d8 872 if(!f->exists) return NULL;
873
3aee1200 874 g_assert(i < f->events->len);
875 return &g_array_index(f->events, LttEventType, i);
6cd62ccf 876}
877
878/*****************************************************************************
879 *Function name
880 * ltt_facility_eventtype_get_by_name
881 * : obtain the event type according to event name
882 * event name is unique in the facility
883 *Input params
cf74a6f1 884 * f : the facility
6cd62ccf 885 * name : the name of the event
886 *Return value
963b5f2d 887 * LttEventType * : the event type required
6cd62ccf 888 ****************************************************************************/
889
3aee1200 890LttEventType *ltt_facility_eventtype_get_by_name(LttFacility *f, GQuark name)
6cd62ccf 891{
cb03932a 892 LttEventType *et = g_datalist_id_get_data(&f->events_by_name, name);
a0c1f622 893 return et;
6cd62ccf 894}
895
This page took 0.121932 seconds and 4 git commands to generate.