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

Reply via email to