X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Fltt%2Ffacility.c;h=6807ef0e91a8081ede942fd1d5dc10d33a457b60;hb=a5dcde2f975b43a9c6069c4a346528588bf1f8c8;hp=bd50c198f90845a53d26439ac4cb5fc90556fd8f;hpb=1417d99025759138157bdaea4f32b7cd8f1f92e4;p=lttv.git diff --git a/ltt/branches/poly/ltt/facility.c b/ltt/branches/poly/ltt/facility.c index bd50c198..6807ef0e 100644 --- a/ltt/branches/poly/ltt/facility.c +++ b/ltt/branches/poly/ltt/facility.c @@ -2,8 +2,9 @@ #include #include -#include #include "parser.h" +#include +#include "ltt-private.h" #include /* search for the (named) type in the table, if it does not exist @@ -23,6 +24,7 @@ void freeFacility(LttFacility * facility); void freeEventtype(LttEventType * evType); void freeLttType(LttType ** type); void freeLttField(LttField * fld); +void freeLttNamedType(LttType * type); /***************************************************************************** @@ -73,6 +75,7 @@ void ltt_facility_open(LttTrace * t, char * pathname) generateChecksum(fac->name, &checksum, &fac->events); f = g_new(LttFacility,1); + f->base_id = 0; generateFacility(f, fac, checksum); t->facility_number++; @@ -173,7 +176,7 @@ void generateFacility(LttFacility *f, facility *fac,LttChecksum checksum) void constructTypeAndFields(LttFacility * fac,type_descriptor * td, LttField * fld) { - int i; + int i, flag; type_descriptor * tmpTd; // if(td->type == LTT_STRING || td->type == LTT_SEQUENCE) @@ -211,17 +214,30 @@ void constructTypeAndFields(LttFacility * fac,type_descriptor * td, constructTypeAndFields(fac, tmpTd, fld->child[0]); }else if(td->type == LTT_STRUCT){ fld->field_type->element_number = td->fields.position; - fld->field_type->element_type = g_new(LttType*, td->fields.position); + + if(fld->field_type->element_type == NULL){ + fld->field_type->element_type = g_new(LttType*, td->fields.position); + flag = 1; + }else{ + flag = 0; + } + fld->child = g_new(LttField*, td->fields.position); for(i=0;ifields.position;i++){ tmpTd = ((field*)(td->fields.array[i]))->type; - fld->field_type->element_type[i] = lookup_named_type(fac, tmpTd); + + if(flag) + fld->field_type->element_type[i] = lookup_named_type(fac, tmpTd); fld->child[i] = g_new(LttField,1); fld->child[i]->field_pos = i; fld->child[i]->field_type = fld->field_type->element_type[i]; - fld->child[i]->field_type->element_name - = g_strdup(((field*)(td->fields.array[i]))->name); + + if(flag){ + fld->child[i]->field_type->element_name + = g_strdup(((field*)(td->fields.array[i]))->name); + } + fld->child[i]->offset_root = -1; fld->child[i]->fixed_root = -1; fld->child[i]->offset_parent = -1; @@ -257,9 +273,11 @@ LttType * lookup_named_type(LttFacility *fac, type_descriptor * td) if(td->type_name){ for(i=0;inamed_types_number; i++){ if(fac->named_types[i] == NULL) break; - name = fac->named_types[i]->element_name; + name = fac->named_types[i]->type_name; if(strcmp(name, td->type_name)==0){ - lttType = fac->named_types[i]; + lttType = fac->named_types[i]; + // if(lttType->element_name) g_free(lttType->element_name); + // lttType->element_name = NULL; break; } } @@ -274,12 +292,13 @@ LttType * lookup_named_type(LttFacility *fac, type_descriptor * td) lttType->enum_strings = NULL; lttType->element_type = NULL; lttType->element_number = 0; + lttType->element_name = NULL; if(td->type_name){ - lttType->element_name = g_strdup(td->type_name); + lttType->type_name = g_strdup(td->type_name); fac->named_types[i] = lttType; } else{ - lttType->element_name = NULL; + lttType->type_name = NULL; } } @@ -321,6 +340,10 @@ void freeFacility(LttFacility * fac) g_free(fac->events); //free all named types + for(i=0;inamed_types_number;i++){ + freeLttNamedType(fac->named_types[i]); + fac->named_types[i] = NULL; + } g_free(fac->named_types); //free the facility itself @@ -329,20 +352,34 @@ void freeFacility(LttFacility * fac) void freeEventtype(LttEventType * evType) { + LttType * root_type; g_free(evType->name); if(evType->description) g_free(evType->description); if(evType->root_field){ + root_type = evType->root_field->field_type; freeLttField(evType->root_field); + freeLttType(&root_type); } g_free(evType); } +void freeLttNamedType(LttType * type) +{ + int i; + g_free(type->type_name); + type->type_name = NULL; + freeLttType(&type); +} + void freeLttType(LttType ** type) { int i; if(*type == NULL) return; + if((*type)->type_name){ + return; //this is a named type + } if((*type)->element_name) g_free((*type)->element_name); if((*type)->fmt) @@ -354,8 +391,8 @@ void freeLttType(LttType ** type) } if((*type)->element_type){ - // for(i=0;i<(*type)->element_number;i++) - // freeLttType(&((*type)->element_type[i])); + for(i=0;i<(*type)->element_number;i++) + freeLttType(&((*type)->element_type[i])); g_free((*type)->element_type); } g_free(*type); @@ -365,7 +402,7 @@ void freeLttType(LttType ** type) void freeLttField(LttField * fld) { int i; - int size; + int size = 0; if(fld->field_type){ if(fld->field_type->type_class == LTT_ARRAY || @@ -374,7 +411,6 @@ void freeLttField(LttField * fld) }else if(fld->field_type->type_class == LTT_STRUCT){ size = fld->field_type->element_number; } - freeLttType(&(fld->field_type)); } if(fld->child){