Changeset: 695471f48664 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=695471f48664 Modified Files: monetdb5/extras/rdf/rdfschema.c monetdb5/extras/rdf/rdfschema.h monetdb5/modules/mal/tokenizer.c sql/backends/monet5/sql.mx Branch: rdf Log Message:
Fix memory leaks. - Memory leak from adding an element to a set - Memory leak because of using takeOid function. There are still memory leaks appearing in rdflabels.c diffs (truncated from 336 to 300 lines): diff --git a/monetdb5/extras/rdf/rdfschema.c b/monetdb5/extras/rdf/rdfschema.c --- a/monetdb5/extras/rdf/rdfschema.c +++ b/monetdb5/extras/rdf/rdfschema.c @@ -166,8 +166,8 @@ void addmergeCStoSet(mergeCSset *mergecs */ static -CSrel* creataCSrel(oid csoid){ - CSrel *csrel = (CSrel*) malloc(sizeof(CSrel)); +void creataCSrel(oid csoid, CSrel *csrel){ + //CSrel *csrel = (CSrel*) malloc(sizeof(CSrel)); csrel->origCSoid = csoid; csrel->lstRefCSoid = (oid*) malloc(sizeof(oid) * INIT_NUM_CSREL); csrel->lstPropId = (oid*) malloc(sizeof(oid) * INIT_NUM_CSREL); @@ -176,7 +176,7 @@ CSrel* creataCSrel(oid csoid){ csrel->numRef = 0; csrel->numAllocation = INIT_NUM_CSREL; - return csrel; + //return csrel; } @@ -300,10 +300,11 @@ static CSrel* initCSrelset(oid numCSrel){ oid i; CSrel *csrelSet = (CSrel*) malloc(sizeof(CSrel) * numCSrel); - CSrel *csrel; + //CSrel *csrel; for (i = 0; i < numCSrel; i++){ - csrel = creataCSrel(i); - csrelSet[i] = (CSrel) *csrel; + //csrel = creataCSrel(i); + //csrelSet[i] = (CSrel) *csrel; + creataCSrel(i, &csrelSet[i]); } return csrelSet; } @@ -540,6 +541,7 @@ str printCSrelWithMaxSet(CSset *freqCSse #if SHOWPROPERTYNAME takeOid(csrelBetweenMaxSet[i].lstPropId[j], &propStr); fprintf(fout2, BUNFMT "(P:" BUNFMT " - %s) (%d)(Blank:%d) ", csrelBetweenMaxSet[i].lstRefCSoid[j],csrelBetweenMaxSet[i].lstPropId[j], propStr, csrelBetweenMaxSet[i].lstCnt[j], csrelBetweenMaxSet[i].lstBlankCnt[j]); + GDKfree(propStr); #else fprintf(fout2, BUNFMT "(P:" BUNFMT ") (%d)(Blank:%d) ", csrelBetweenMaxSet[i].lstRefCSoid[j],csrelBetweenMaxSet[i].lstPropId[j], csrelBetweenMaxSet[i].lstCnt[j], csrelBetweenMaxSet[i].lstBlankCnt[j]); #endif @@ -713,6 +715,7 @@ CSPropTypes* initCSPropTypes(CSset* freq for (j = 0; j < csPropTypes[id].numProp; j++){ csPropTypes[id].lstPropTypes[j].prop = freqCSset->items[i].lstProp[j]; csPropTypes[id].lstPropTypes[j].propFreq = 0; + csPropTypes[id].lstPropTypes[j].propCover = 0; csPropTypes[id].lstPropTypes[j].numType = MULTIVALUES + 1; csPropTypes[id].lstPropTypes[j].defaultType = STRING; csPropTypes[id].lstPropTypes[j].lstTypes = (char*)GDKmalloc(sizeof(char) * csPropTypes[id].lstPropTypes[j].numType); @@ -784,7 +787,7 @@ void genCSPropTypesColIdx(CSPropTypes* c for (i = 0; i < numMergedCS; i++){ printf("MergedCS %d (Freq: %d): \n", i, freqCSset->items[csPropTypes[i].freqCSId].support); for(j = 0; j < csPropTypes[i].numProp; j++){ - printf(" P " BUNFMT "(%d):", csPropTypes[i].lstPropTypes[j].prop, csPropTypes[i].lstPropTypes[j].defaultType); + printf(" P " BUNFMT "(%d | cov:%d):", csPropTypes[i].lstPropTypes[j].prop, csPropTypes[i].lstPropTypes[j].defaultType,csPropTypes[i].lstPropTypes[j].propCover); for (k = 0; k < csPropTypes[i].lstPropTypes[j].numType; k++){ printf(" Type %d (%d) | ", k, csPropTypes[i].lstPropTypes[j].lstFreq[k]); } @@ -804,7 +807,7 @@ void genCSPropTypesColIdx(CSPropTypes* c * csPropTypes[tbIdx] contains properties {1,3,4,5,7} with types for each property and frequency of each <property, type> * */ static -void addPropTypes(char *buffTypes, oid* buffP, int numP, int csId, int* csTblIdxMapping, CSPropTypes* csPropTypes){ +void addPropTypes(char *buffTypes, oid* buffP, int numP, int* buffCover, int csId, int* csTblIdxMapping, CSPropTypes* csPropTypes){ int i,j; int tblId = csTblIdxMapping[csId]; @@ -817,9 +820,11 @@ void addPropTypes(char *buffTypes, oid* j++; } //j is position of the property buffP[i] in csPropTypes[tblId] + csPropTypes[tblId].lstPropTypes[j].propFreq++; + csPropTypes[tblId].lstPropTypes[j].propCover += buffCover[i]; csPropTypes[tblId].lstPropTypes[j].lstFreq[(int)buffTypes[i]]++; - + } } //printf("\n"); @@ -855,25 +860,21 @@ SubCS* creatSubCS(oid subCSId, int numP, } static -SubCSSet* createaSubCSSet(oid csId){ - SubCSSet* subCSset = (SubCSSet*) malloc(sizeof(SubCSSet)); +void createaSubCSSet(oid csId, SubCSSet* subCSset){ subCSset->csId = csId; subCSset->numAllocation = INIT_NUM_SUBCS; subCSset->numSubCS = 0; subCSset->subCSs = (SubCS*) malloc(sizeof(SubCS) * INIT_NUM_SUBCS); subCSset->freq = (int*) malloc(sizeof(int) * INIT_NUM_SUBCS); - return subCSset; } static SubCSSet* initCS_SubCSSets(oid numSubCSSet){ oid i; SubCSSet *subcssets = (SubCSSet*) malloc(sizeof(SubCSSet) * numSubCSSet); - SubCSSet *subcsset; for (i = 0; i < numSubCSSet;i++){ - subcsset = createaSubCSSet(i); - subcssets[i] = (SubCSSet) *subcsset; + createaSubCSSet(i, &subcssets[i]); } return subcssets; @@ -969,7 +970,8 @@ oid addSubCS(char *buff, int numP, int c if (isFound == 0){ // Add new subCS = creatSubCS(subCSId, numP, buff, subCSsign); - addSubCStoSet(subcsset,*subCS); + addSubCStoSet(subcsset, *subCS); + free(subCS); } else{ // Exist //Update frequency @@ -985,6 +987,10 @@ void freeCSset(CSset *csSet){ int i; for(i = 0; i < csSet->numCSadded; i ++){ free(csSet->items[i].lstProp); + #if STOREFULLCS + free(csSet->items[i].lstObj); + #endif + } free(csSet->items); free(csSet); @@ -1305,6 +1311,7 @@ str printFreqCSSet(CSset *freqCSset, BAT takeOid(cs.csId, &subStr); printf("CS " BUNFMT " (Freq: %d) | Subject: %s | Parent " BUNFMT " \n", cs.csId, *freq, subStr, freqCSset->items[cs.parentFreqIdx].csId); + GDKfree(subStr); for (j = 0; j < cs.numProp; j++){ printf(" P:" BUNFMT " --> \n", cs.lstProp[j]); } @@ -1337,6 +1344,8 @@ str printFreqCSSet(CSset *freqCSset, BAT if (cs.type == MAXCS){ fprintf(fout2,"CS " BUNFMT " (Freq: %d) | Subject: %s | Parent " BUNFMT " \n", cs.csId, *freq, subStr, cs.csId); } + + GDKfree(subStr); for (j = 0; j < cs.numProp; j++){ takeOid(cs.lstProp[j], &propStr); @@ -1346,6 +1355,8 @@ str printFreqCSSet(CSset *freqCSset, BAT fprintf(fout2, " P:%s --> ", propStr); } + GDKfree(propStr); + // Get object value objOid = cs.lstObj[j]; @@ -1366,6 +1377,10 @@ str printFreqCSSet(CSset *freqCSset, BAT fprintf(fout2, " O: %s \n", objStr); } + if (objType == URI || objType == BLANKNODE){ + GDKfree(objStr); + } + } fprintf(fout, "\n"); @@ -1458,6 +1473,7 @@ str printmergeCSSet(CSset *freqCSset, in for (j = 0; j < cs.numProp; j++){ takeOid(cs.lstProp[j], &propStr); fprintf(fout," %s\n", propStr); + GDKfree(propStr); } fprintf(fout, "\n"); } @@ -1769,6 +1785,7 @@ oid putaCStoHash(CSBats *csBats, oid* ke freqCS = creatCS(csId, num, key, FREQCS,-1,0,0); #endif addCStoSet(freqCSset, *freqCS); + free(freqCS); } } else{ @@ -1791,6 +1808,7 @@ oid putaCStoHash(CSBats *csBats, oid* ke freqCS = creatCS(csId, num, key, FREQCS,-1,0,0); #endif addCStoSet(freqCSset, *freqCS); + free(freqCS); } } @@ -1813,6 +1831,7 @@ oid putaCStoHash(CSBats *csBats, oid* ke freqCS = creatCS(csId, num, key, FREQCS,-1,0,0); #endif addCStoSet(freqCSset, *freqCS); + free(freqCS); } } } @@ -2471,6 +2490,7 @@ void mergeMaximumFreqCSsAll(CSset *freqC cs1->parentFreqIdx = freqCSset->numCSadded; cs2->parentFreqIdx = freqCSset->numCSadded; addCStoSet(freqCSset,*mergecs); + free(mergecs); mercsId++; @@ -3030,13 +3050,15 @@ str RDFExtractCSPropTypes(int *ret, BAT oid curS; /* current Subject oid */ //oid CSoid = 0; /* Characteristic set oid */ int numPwithDup; /* Number of properties for current S */ + int* buffCoverage; /* Number of triples coverage by each property. For deciding on MULTI-VALUED P */ char objType; char* buffTypes; oid* buffP; oid curP; buffTypes = (char *) malloc(sizeof(char) * (maxNumPwithDup + 1)); - buffP = (oid *) malloc(sizeof(char) * (maxNumPwithDup + 1)); + buffP = (oid *) malloc(sizeof(oid) * (maxNumPwithDup + 1)); + buffCoverage = (int *)malloc(sizeof(int) * (maxNumPwithDup + 1)); numPwithDup = 0; curS = 0; @@ -3046,7 +3068,7 @@ str RDFExtractCSPropTypes(int *ret, BAT sbt = (oid *) BUNtloc(si, p); if (*sbt != curS){ if (p != 0){ /* Not the first S */ - addPropTypes(buffTypes, buffP, numPwithDup, subjCSMap[curS], csTblIdxMapping, csPropTypes); + addPropTypes(buffTypes, buffP, numPwithDup, buffCoverage, subjCSMap[curS], csTblIdxMapping, csPropTypes); } curS = *sbt; numPwithDup = 0; @@ -3063,6 +3085,7 @@ str RDFExtractCSPropTypes(int *ret, BAT #if USE_MULTIPLICITY == 1 // Update the object type for this P as MULTIVALUES buffTypes[numPwithDup-1] = MULTIVALUES; + buffCoverage[numPwithDup-1]++; #else buffTypes[numPwithDup] = objType; numPwithDup++; @@ -3071,15 +3094,20 @@ str RDFExtractCSPropTypes(int *ret, BAT else{ buffTypes[numPwithDup] = objType; buffP[numPwithDup] = *pbt; + buffCoverage[numPwithDup] = 1; numPwithDup++; curP = *pbt; } + + } /* Check for the last CS */ - addPropTypes(buffTypes, buffP, numPwithDup, subjCSMap[curS], csTblIdxMapping, csPropTypes); + addPropTypes(buffTypes, buffP, numPwithDup, buffCoverage, subjCSMap[curS], csTblIdxMapping, csPropTypes); free (buffTypes); + free (buffP); + free (buffCoverage); *ret = 1; @@ -3248,6 +3276,7 @@ void printCSmergeRel(CSset *freqCSset, C #if SHOWPROPERTYNAME takeOid(csRelBetweenMergeFreqSet[i].lstPropId[j], &propStr); fprintf(fout2, BUNFMT "(P:" BUNFMT " - %s) (%d)(Blank:%d) ", freqCSset->items[csRelBetweenMergeFreqSet[i].lstRefFreqIdx[j]].csId,csRelBetweenMergeFreqSet[i].lstPropId[j], propStr, csRelBetweenMergeFreqSet[i].lstCnt[j], csRelBetweenMergeFreqSet[i].lstBlankCnt[j]); + GDKfree(propStr); #else fprintf(fout2, BUNFMT "(P:" BUNFMT ") (%d)(Blank:%d) ", freqCSset->items[csRelBetweenMergeFreqSet[i].lstRefFreqIdx[j]].csId,csRelBetweenMergeFreqSet[i].lstPropId[j], csRelBetweenMergeFreqSet[i].lstCnt[j], csRelBetweenMergeFreqSet[i].lstBlankCnt[j]); #endif @@ -3484,6 +3513,7 @@ RDFextractCSwithTypes(int *ret, bat *sba freeMergeCSrelset(csRelBetweenMergeFreqSet,freqCSset->numCSadded); freeCSrelSet(csrelSet, *maxCSoid + 1); freeCSrelSet(csrelToMaxFreqSet, *maxCSoid + 1); + freeCSrelSet(csrelFromMaxFreqSet, *maxCSoid + 1); freeCSrelSet(csrelBetweenMaxFreqSet, *maxCSoid + 1); freeCSBats(csBats); @@ -3732,6 +3762,8 @@ void initCStables(CStableStat* cstablest #endif } + + free(mapObjBATtypes); } @@ -4219,6 +4251,7 @@ RDFreorganize(int *ret, CStableStat *cst free(csTblIdxMapping); free(mfreqIdxTblIdxMapping); free(mTblIdxFreqIdxMapping); + freeCSPropTypes(csPropTypes,numTables); return MAL_SUCCEED; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list