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