git-svn-id: http://ltt.polymtl.ca/svn@176 04897980-b3bd-0310-b5e0-8ef037075253
[lttv.git] / ltt / branches / poly / ltt / facility.c
CommitLineData
6cd62ccf 1#include <stdlib.h>
2#include <string.h>
3#include <stdio.h>
4
fcdf0ec2 5#include <ltt/LTTTypes.h>
6cd62ccf 6#include "parser.h"
7#include <ltt/facility.h>
8
9/* search for the (named) type in the table, if it does not exist
10 create a new one */
963b5f2d 11LttType * lookup_named_type(LttFacility *fac, type_descriptor * td);
6cd62ccf 12
13/* construct directed acyclic graph for types, and tree for fields */
963b5f2d 14void constructTypeAndFields(LttFacility * fac,type_descriptor * td,
15 LttField * fld);
6cd62ccf 16
17/* generate the facility according to the events belongin to it */
963b5f2d 18void generateFacility(LttFacility * f, facility * fac,
19 LttChecksum checksum);
6cd62ccf 20
21/* functions to release the memory occupied by a facility */
963b5f2d 22void freeFacility(LttFacility * facility);
23void freeEventtype(LttEventType * evType);
1417d990 24void freeLttType(LttType ** type);
963b5f2d 25void freeLttField(LttField * fld);
908f42fa 26void freeLttNamedType(LttType * type);
6cd62ccf 27
28
29/*****************************************************************************
30 *Function name
963b5f2d 31 * ltt_facility_open : open facilities
6cd62ccf 32 *Input params
963b5f2d 33 * t : the trace containing the facilities
6cd62ccf 34 * pathname : the path name of the facility
6cd62ccf 35 ****************************************************************************/
36
963b5f2d 37void ltt_facility_open(LttTrace * t, char * pathname)
6cd62ccf 38{
39 char *token;
40 parse_file in;
41 char buffer[BUFFER_SIZE];
963b5f2d 42 facility * fac;
43 LttFacility * f;
44 LttChecksum checksum;
6cd62ccf 45
46 in.buffer = buffer;
47 in.lineno = 0;
48 in.error = error_callback;
963b5f2d 49 in.name = pathname;
6cd62ccf 50
51 in.fp = fopen(in.name, "r");
963b5f2d 52 if(!in.fp ) in.error(&in,"cannot open input file");
53
6cd62ccf 54 while(1){
55 token = getToken(&in);
56 if(in.type == ENDFILE) break;
57
963b5f2d 58 if(strcmp(token, "<")) in.error(&in,"not a facility file");
59 token = getName(&in);
60
61 if(strcmp("facility",token) == 0) {
62 fac = g_new(facility, 1);
63 fac->name = NULL;
64 fac->description = NULL;
65 sequence_init(&(fac->events));
66 table_init(&(fac->named_types));
67 sequence_init(&(fac->unnamed_types));
68
69 parseFacility(&in, fac);
70
71 //check if any namedType is not defined
72 checkNamedTypesImplemented(&fac->named_types);
73
74 generateChecksum(fac->name, &checksum, &fac->events);
75
76 f = g_new(LttFacility,1);
77 generateFacility(f, fac, checksum);
78
79 t->facility_number++;
80 g_ptr_array_add(t->facilities,f);
81
82 free(fac->name);
83 free(fac->description);
84 freeEvents(&fac->events);
85 sequence_dispose(&fac->events);
86 freeNamedType(&fac->named_types);
87 table_dispose(&fac->named_types);
88 freeTypes(&fac->unnamed_types);
89 sequence_dispose(&fac->unnamed_types);
cf1307af 90 g_free(fac);
6cd62ccf 91 }
963b5f2d 92 else in.error(&in,"facility token was expected");
6cd62ccf 93 }
6cd62ccf 94 fclose(in.fp);
6cd62ccf 95}
96
97
98/*****************************************************************************
99 *Function name
100 * generateFacility : generate facility, internal function
101 *Input params
963b5f2d 102 * facility : LttFacilty structure
103 * fac : facility structure
6cd62ccf 104 * checksum : checksum of the facility
6cd62ccf 105 ****************************************************************************/
106
963b5f2d 107void generateFacility(LttFacility *f, facility *fac,LttChecksum checksum)
6cd62ccf 108{
963b5f2d 109 char * facilityName = fac->name;
110 sequence * events = &fac->events;
6cd62ccf 111 int i;
963b5f2d 112 LttEventType * evType;
113 LttField * field;
114 LttType * type;
6cd62ccf 115
963b5f2d 116 f->name = g_strdup(facilityName);
117 f->event_number = events->position;
118 f->checksum = checksum;
6cd62ccf 119
120 //initialize inner structures
963b5f2d 121 f->events = g_new(LttEventType*,f->event_number);
1417d990 122 f->named_types_number = fac->named_types.keys.position;
123 f->named_types = g_new(LttType*, fac->named_types.keys.position);
124 for(i=0;i<fac->named_types.keys.position;i++) f->named_types[i] = NULL;
6cd62ccf 125
126 //for each event, construct field tree and type graph
127 for(i=0;i<events->position;i++){
963b5f2d 128 evType = g_new(LttEventType,1);
129 f->events[i] = evType;
6cd62ccf 130
131 evType->name = g_strdup(((event*)(events->array[i]))->name);
132 evType->description=g_strdup(((event*)(events->array[i]))->description);
133
963b5f2d 134 field = g_new(LttField, 1);
6cd62ccf 135 evType->root_field = field;
963b5f2d 136 evType->facility = f;
6cd62ccf 137 evType->index = i;
138
8710c6c7 139 if(((event*)(events->array[i]))->type != NULL){
140 field->field_pos = 0;
141 type = lookup_named_type(f,((event*)(events->array[i]))->type);
142 field->field_type = type;
143 field->offset_root = 0;
144 field->fixed_root = 1;
145 field->offset_parent = 0;
146 field->fixed_parent = 1;
147 // field->base_address = NULL;
148 field->field_size = 0;
149 field->field_fixed = -1;
150 field->parent = NULL;
151 field->child = NULL;
152 field->current_element = 0;
72a508f8 153
8710c6c7 154 //construct field tree and type graph
155 constructTypeAndFields(f,((event*)(events->array[i]))->type,field);
156 }else{
72a508f8 157 evType->root_field = NULL;
8710c6c7 158 g_free(field);
159 }
6cd62ccf 160 }
161}
162
163
164/*****************************************************************************
165 *Function name
166 * constructTypeAndFields : construct field tree and type graph,
167 * internal recursion function
168 *Input params
169 * fac : facility struct
170 * td : type descriptor
171 * root_field : root field of the event
172 ****************************************************************************/
173
963b5f2d 174void constructTypeAndFields(LttFacility * fac,type_descriptor * td,
175 LttField * fld)
6cd62ccf 176{
908f42fa 177 int i, flag;
6cd62ccf 178 type_descriptor * tmpTd;
179
180 // if(td->type == LTT_STRING || td->type == LTT_SEQUENCE)
181 // fld->field_size = 0;
182 // else fld->field_size = -1;
183
184 if(td->type == LTT_ENUM){
185 fld->field_type->element_number = td->labels.position;
186 fld->field_type->enum_strings = g_new(char*,td->labels.position);
187 for(i=0;i<td->labels.position;i++){
188 fld->field_type->enum_strings[i]
189 = g_strdup(((char*)(td->labels.array[i])));
190 }
191 }else if(td->type == LTT_ARRAY || td->type == LTT_SEQUENCE){
192 if(td->type == LTT_ARRAY)
193 fld->field_type->element_number = (unsigned)td->size;
963b5f2d 194 fld->field_type->element_type = g_new(LttType*,1);
6cd62ccf 195 tmpTd = td->nested_type;
196 fld->field_type->element_type[0] = lookup_named_type(fac, tmpTd);
963b5f2d 197 fld->child = g_new(LttField*, 1);
198 fld->child[0] = g_new(LttField, 1);
6cd62ccf 199
200 fld->child[0]->field_pos = 0;
201 fld->child[0]->field_type = fld->field_type->element_type[0];
202 fld->child[0]->offset_root = fld->offset_root;
203 fld->child[0]->fixed_root = fld->fixed_root;
204 fld->child[0]->offset_parent = 0;
205 fld->child[0]->fixed_parent = 1;
206 // fld->child[0]->base_address = NULL;
207 fld->child[0]->field_size = 0;
208 fld->child[0]->field_fixed = -1;
209 fld->child[0]->parent = fld;
210 fld->child[0]->child = NULL;
211 fld->child[0]->current_element = 0;
212 constructTypeAndFields(fac, tmpTd, fld->child[0]);
213 }else if(td->type == LTT_STRUCT){
214 fld->field_type->element_number = td->fields.position;
908f42fa 215
216 if(fld->field_type->element_type == NULL){
217 fld->field_type->element_type = g_new(LttType*, td->fields.position);
218 flag = 1;
219 }else{
220 flag = 0;
221 }
222
963b5f2d 223 fld->child = g_new(LttField*, td->fields.position);
6cd62ccf 224 for(i=0;i<td->fields.position;i++){
225 tmpTd = ((field*)(td->fields.array[i]))->type;
908f42fa 226
227 if(flag)
228 fld->field_type->element_type[i] = lookup_named_type(fac, tmpTd);
963b5f2d 229 fld->child[i] = g_new(LttField,1);
6cd62ccf 230
231 fld->child[i]->field_pos = i;
232 fld->child[i]->field_type = fld->field_type->element_type[i];
908f42fa 233
234 if(flag){
235 fld->child[i]->field_type->element_name
236 = g_strdup(((field*)(td->fields.array[i]))->name);
237 }
238
6cd62ccf 239 fld->child[i]->offset_root = -1;
240 fld->child[i]->fixed_root = -1;
241 fld->child[i]->offset_parent = -1;
242 fld->child[i]->fixed_parent = -1;
243 // fld->child[i]->base_address = NULL;
244 fld->child[i]->field_size = 0;
245 fld->child[i]->field_fixed = -1;
246 fld->child[i]->parent = fld;
247 fld->child[i]->child = NULL;
248 fld->child[i]->current_element = 0;
249 constructTypeAndFields(fac, tmpTd, fld->child[i]);
250 }
251 }
252}
253
254
255/*****************************************************************************
256 *Function name
257 * lookup_named_type: search named type in the table
258 * internal function
259 *Input params
260 * fac : facility struct
261 * td : type descriptor
262 *Return value
963b5f2d 263 * : either find the named type, or create a new LttType
6cd62ccf 264 ****************************************************************************/
265
963b5f2d 266LttType * lookup_named_type(LttFacility *fac, type_descriptor * td)
6cd62ccf 267{
963b5f2d 268 LttType * lttType = NULL;
6cd62ccf 269 int i;
270 char * name;
271 if(td->type_name){
1417d990 272 for(i=0;i<fac->named_types_number; i++){
273 if(fac->named_types[i] == NULL) break;
908f42fa 274 name = fac->named_types[i]->type_name;
6cd62ccf 275 if(strcmp(name, td->type_name)==0){
908f42fa 276 lttType = fac->named_types[i];
277 // if(lttType->element_name) g_free(lttType->element_name);
278 // lttType->element_name = NULL;
1417d990 279 break;
6cd62ccf 280 }
281 }
282 }
283
284 if(!lttType){
963b5f2d 285 lttType = g_new(LttType,1);
6cd62ccf 286 lttType->type_class = td->type;
287 if(td->fmt) lttType->fmt = g_strdup(td->fmt);
288 else lttType->fmt = NULL;
289 lttType->size = td->size;
290 lttType->enum_strings = NULL;
291 lttType->element_type = NULL;
292 lttType->element_number = 0;
908f42fa 293 lttType->element_name = NULL;
6cd62ccf 294 if(td->type_name){
908f42fa 295 lttType->type_name = g_strdup(td->type_name);
1417d990 296 fac->named_types[i] = lttType;
6cd62ccf 297 }
298 else{
908f42fa 299 lttType->type_name = NULL;
6cd62ccf 300 }
301 }
302
303 return lttType;
304}
305
306
307/*****************************************************************************
308 *Function name
309 * ltt_facility_close : close a facility, decrease its usage count,
310 * if usage count = 0, release the memory
311 *Input params
312 * f : facility that will be closed
313 *Return value
314 * int : usage count ?? status
315 ****************************************************************************/
316
963b5f2d 317int ltt_facility_close(LttFacility *f)
6cd62ccf 318{
6cd62ccf 319 //release the memory it occupied
320 freeFacility(f);
321
322 return 0;
323}
324
325/*****************************************************************************
326 * Functions to release the memory occupied by the facility
327 ****************************************************************************/
328
963b5f2d 329void freeFacility(LttFacility * fac)
6cd62ccf 330{
331 int i;
332 g_free(fac->name); //free facility name
333
334 //free event types
335 for(i=0;i<fac->event_number;i++){
336 freeEventtype(fac->events[i]);
337 }
963b5f2d 338 g_free(fac->events);
6cd62ccf 339
340 //free all named types
908f42fa 341 for(i=0;i<fac->named_types_number;i++){
342 freeLttNamedType(fac->named_types[i]);
343 fac->named_types[i] = NULL;
344 }
1417d990 345 g_free(fac->named_types);
6cd62ccf 346
347 //free the facility itself
348 g_free(fac);
349}
350
963b5f2d 351void freeEventtype(LttEventType * evType)
6cd62ccf 352{
908f42fa 353 LttType * root_type;
6cd62ccf 354 g_free(evType->name);
355 if(evType->description)
356 g_free(evType->description);
1417d990 357 if(evType->root_field){
908f42fa 358 root_type = evType->root_field->field_type;
1417d990 359 freeLttField(evType->root_field);
908f42fa 360 freeLttType(&root_type);
1417d990 361 }
362
6cd62ccf 363 g_free(evType);
364}
365
908f42fa 366void freeLttNamedType(LttType * type)
367{
368 int i;
369 g_free(type->type_name);
370 type->type_name = NULL;
371 freeLttType(&type);
372}
373
1417d990 374void freeLttType(LttType ** type)
6cd62ccf 375{
376 int i;
1417d990 377 if(*type == NULL) return;
908f42fa 378 if((*type)->type_name){
379 return; //this is a named type
380 }
1417d990 381 if((*type)->element_name)
382 g_free((*type)->element_name);
383 if((*type)->fmt)
384 g_free((*type)->fmt);
385 if((*type)->enum_strings){
386 for(i=0;i<(*type)->element_number;i++)
387 g_free((*type)->enum_strings[i]);
388 g_free((*type)->enum_strings);
6cd62ccf 389 }
6cd62ccf 390
1417d990 391 if((*type)->element_type){
908f42fa 392 for(i=0;i<(*type)->element_number;i++)
393 freeLttType(&((*type)->element_type[i]));
1417d990 394 g_free((*type)->element_type);
6cd62ccf 395 }
1417d990 396 g_free(*type);
397 *type = NULL;
6cd62ccf 398}
399
1417d990 400void freeLttField(LttField * fld)
401{
963b5f2d 402 int i;
908f42fa 403 int size = 0;
1417d990 404
405 if(fld->field_type){
406 if(fld->field_type->type_class == LTT_ARRAY ||
407 fld->field_type->type_class == LTT_SEQUENCE){
408 size = 1;
409 }else if(fld->field_type->type_class == LTT_STRUCT){
410 size = fld->field_type->element_number;
411 }
963b5f2d 412 }
6cd62ccf 413
1417d990 414 if(fld->child){
415 for(i=0; i<size; i++){
416 if(fld->child[i])freeLttField(fld->child[i]);
417 }
6cd62ccf 418 g_free(fld->child);
1417d990 419 }
6cd62ccf 420 g_free(fld);
421}
422
423/*****************************************************************************
424 *Function name
425 * ltt_facility_name : obtain the facility's name
426 *Input params
427 * f : the facility that will be closed
428 *Return value
429 * char * : the facility's name
430 ****************************************************************************/
431
963b5f2d 432char *ltt_facility_name(LttFacility *f)
6cd62ccf 433{
434 return f->name;
435}
436
437/*****************************************************************************
438 *Function name
439 * ltt_facility_checksum : obtain the facility's checksum
440 *Input params
441 * f : the facility that will be closed
442 *Return value
963b5f2d 443 * LttChecksum : the checksum of the facility
6cd62ccf 444 ****************************************************************************/
445
963b5f2d 446LttChecksum ltt_facility_checksum(LttFacility *f)
6cd62ccf 447{
448 return f->checksum;
449}
450
963b5f2d 451/*****************************************************************************
452 *Function name
453 * ltt_facility_base_id : obtain the facility base id
454 *Input params
455 * f : the facility
456 *Return value
457 * : the base id of the facility
458 ****************************************************************************/
459
460unsigned ltt_facility_base_id(LttFacility *f)
461{
462 return f->base_id;
463}
464
6cd62ccf 465/*****************************************************************************
466 *Function name
467 * ltt_facility_eventtype_number: obtain the number of the event types
468 *Input params
469 * f : the facility that will be closed
470 *Return value
471 * unsigned : the number of the event types
472 ****************************************************************************/
473
963b5f2d 474unsigned ltt_facility_eventtype_number(LttFacility *f)
6cd62ccf 475{
476 return (unsigned)(f->event_number);
477}
478
479/*****************************************************************************
480 *Function name
481 * ltt_facility_eventtype_get: obtain the event type according to event id
482 * from 0 to event_number - 1
483 *Input params
484 * f : the facility that will be closed
485 *Return value
963b5f2d 486 * LttEventType * : the event type required
6cd62ccf 487 ****************************************************************************/
488
963b5f2d 489LttEventType *ltt_facility_eventtype_get(LttFacility *f, unsigned i)
6cd62ccf 490{
491 return f->events[i];
492}
493
494/*****************************************************************************
495 *Function name
496 * ltt_facility_eventtype_get_by_name
497 * : obtain the event type according to event name
498 * event name is unique in the facility
499 *Input params
500 * f : the facility that will be closed
501 * name : the name of the event
502 *Return value
963b5f2d 503 * LttEventType * : the event type required
6cd62ccf 504 ****************************************************************************/
505
963b5f2d 506LttEventType *ltt_facility_eventtype_get_by_name(LttFacility *f, char *name)
6cd62ccf 507{
508 int i;
963b5f2d 509 LttEventType * ev;
6cd62ccf 510 for(i=0;i<f->event_number;i++){
511 ev = f->events[i];
512 if(strcmp(ev->name, name) == 0)break;
513 }
514
515 if(i==f->event_number) return NULL;
516 else return ev;
517}
518
This page took 0.045607 seconds and 4 git commands to generate.