Revision: 26710
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26710
Author:   blendix
Date:     2010-02-08 16:01:11 +0100 (Mon, 08 Feb 2010)

Log Message:
-----------
Fix for a memory leak in subsurf code that is using memory arena, temporary
arrays are now allocated with regular guardedalloc.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/CCGSubSurf.c

Modified: trunk/blender/source/blender/blenkernel/intern/CCGSubSurf.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/CCGSubSurf.c 2010-02-08 
14:59:59 UTC (rev 26709)
+++ trunk/blender/source/blender/blenkernel/intern/CCGSubSurf.c 2010-02-08 
15:01:11 UTC (rev 26710)
@@ -6,6 +6,7 @@
 
 #include "CCGSubSurf.h"
 
+#include "MEM_guardedalloc.h"
 #include "BLO_sys_types.h" // for intptr_t support
 
 #ifdef _MSC_VER
@@ -689,8 +690,8 @@
                _ehash_free(ss->oldEMap, (EHEntryFreeFP) _edge_free, ss);
                _ehash_free(ss->oldVMap, (EHEntryFreeFP) _vert_free, ss);
 
-               CCGSUBSURF_free(ss, ss->tempVerts);
-               CCGSUBSURF_free(ss, ss->tempEdges);
+               MEM_freeN(ss->tempVerts);
+               MEM_freeN(ss->tempEdges);
        }
 
        CCGSUBSURF_free(ss, ss->r);
@@ -815,8 +816,8 @@
        ss->numGrids = 0;
 
        ss->lenTempArrays = 12;
-       ss->tempVerts = CCGSUBSURF_alloc(ss, 
sizeof(*ss->tempVerts)*ss->lenTempArrays);
-       ss->tempEdges = CCGSUBSURF_alloc(ss, 
sizeof(*ss->tempEdges)*ss->lenTempArrays);
+       ss->tempVerts = MEM_mallocN(sizeof(*ss->tempVerts)*ss->lenTempArrays, 
"CCGSubsurf tempVerts");
+       ss->tempEdges = MEM_mallocN(sizeof(*ss->tempEdges)*ss->lenTempArrays, 
"CCGSubsurf tempEdges");
 
        ss->syncState = eSyncState_Vert;
 
@@ -1006,10 +1007,9 @@
        int j, k, topologyChanged = 0;
 
        if (numVerts>ss->lenTempArrays) {
-               int oldLen = ss->lenTempArrays;
                ss->lenTempArrays = 
(numVerts<ss->lenTempArrays*2)?ss->lenTempArrays*2:numVerts;
-               ss->tempVerts = CCGSUBSURF_realloc(ss, ss->tempVerts, 
sizeof(*ss->tempVerts)*ss->lenTempArrays, sizeof(*ss->tempVerts)*oldLen);
-               ss->tempEdges = CCGSUBSURF_realloc(ss, ss->tempEdges, 
sizeof(*ss->tempEdges)*ss->lenTempArrays, sizeof(*ss->tempEdges)*oldLen);
+               ss->tempVerts = MEM_reallocN(ss->tempVerts, 
sizeof(*ss->tempVerts)*ss->lenTempArrays);
+               ss->tempEdges = MEM_reallocN(ss->tempEdges, 
sizeof(*ss->tempEdges)*ss->lenTempArrays);
        }
 
        if (ss->syncState==eSyncState_Partial) {
@@ -1124,8 +1124,8 @@
                _ehash_free(ss->oldFMap, (EHEntryFreeFP) 
_face_unlinkMarkAndFree, ss);
                _ehash_free(ss->oldEMap, (EHEntryFreeFP) 
_edge_unlinkMarkAndFree, ss);
                _ehash_free(ss->oldVMap, (EHEntryFreeFP) _vert_free, ss);
-               CCGSUBSURF_free(ss, ss->tempEdges);
-               CCGSUBSURF_free(ss, ss->tempVerts);
+               MEM_freeN(ss->tempEdges);
+               MEM_freeN(ss->tempVerts);
 
                ss->lenTempArrays = 0;
 
@@ -1691,8 +1691,8 @@
 
                #pragma omp critical
                {
-                       q = CCGSUBSURF_alloc(ss, ss->meshIFC.vertDataSize);
-                       r = CCGSUBSURF_alloc(ss, ss->meshIFC.vertDataSize);
+                       q = MEM_mallocN(ss->meshIFC.vertDataSize, "CCGSubsurf 
q");
+                       r = MEM_mallocN(ss->meshIFC.vertDataSize, "CCGSubsurf 
r");
                }
 
                #pragma omp for schedule(static)
@@ -1781,8 +1781,8 @@
 
                #pragma omp critical
                {
-                       CCGSUBSURF_free(ss, q);
-                       CCGSUBSURF_free(ss, r);
+                       MEM_freeN(q);
+                       MEM_freeN(r);
                }
        }
 
@@ -1837,9 +1837,9 @@
        int curLvl, nextLvl;
        void *q = ss->q, *r = ss->r;
 
-       effectedV = CCGSUBSURF_alloc(ss, 
sizeof(*effectedV)*ss->vMap->numEntries);
-       effectedE = CCGSUBSURF_alloc(ss, 
sizeof(*effectedE)*ss->eMap->numEntries);
-       effectedF = CCGSUBSURF_alloc(ss, 
sizeof(*effectedF)*ss->fMap->numEntries);
+       effectedV = MEM_mallocN(sizeof(*effectedV)*ss->vMap->numEntries, 
"CCGSubsurf effectedV");
+       effectedE = MEM_mallocN(sizeof(*effectedE)*ss->eMap->numEntries, 
"CCGSubsurf effectedE");
+       effectedF = MEM_mallocN(sizeof(*effectedF)*ss->fMap->numEntries, 
"CCGSubsurf effectedF");
        numEffectedV = numEffectedE = numEffectedF = 0;
        for (i=0; i<ss->vMap->curSize; i++) {
                CCGVert *v = (CCGVert*) ss->vMap->buckets[i];
@@ -2097,9 +2097,9 @@
                e->flags = 0;
        }
 
-       CCGSUBSURF_free(ss, effectedF);
-       CCGSUBSURF_free(ss, effectedE);
-       CCGSUBSURF_free(ss, effectedV);
+       MEM_freeN(effectedF);
+       MEM_freeN(effectedE);
+       MEM_freeN(effectedV);
 }
 
 static void ccgSubSurf__allFaces(CCGSubSurf *ss, CCGFace ***faces, int 
*numFaces, int *freeFaces)
@@ -2108,7 +2108,7 @@
        int i, num;
 
        if(!*faces) {
-               array = CCGSUBSURF_alloc(ss, 
sizeof(*array)*ss->fMap->numEntries);
+               array = MEM_mallocN(sizeof(*array)*ss->fMap->numEntries, 
"CCGSubsurf allFaces");
                num = 0;
                for (i=0; i<ss->fMap->curSize; i++) {
                        CCGFace *f = (CCGFace*) ss->fMap->buckets[i];
@@ -2131,8 +2131,8 @@
        CCGEdge **arrayE;
        int numV, numE, i, j;
 
-       arrayV = CCGSUBSURF_alloc(ss, sizeof(*arrayV)*ss->vMap->numEntries);
-       arrayE = CCGSUBSURF_alloc(ss, sizeof(*arrayE)*ss->eMap->numEntries);
+       arrayV = MEM_mallocN(sizeof(*arrayV)*ss->vMap->numEntries, "CCGSubsurf 
arrayV");
+       arrayE = MEM_mallocN(sizeof(*arrayE)*ss->eMap->numEntries, "CCGSubsurf 
arrayV");
        numV = numE = 0;
 
        for (i=0; i<numFaces; i++) {
@@ -2210,7 +2210,7 @@
                }
        }
 
-       if(freeF) CCGSUBSURF_free(ss, effectedF);
+       if(freeF) MEM_freeN(effectedF);
 
        return eCCGError_None;
 }
@@ -2252,7 +2252,7 @@
                }
        }
 
-       if(freeF) CCGSUBSURF_free(ss, effectedF);
+       if(freeF) MEM_freeN(effectedF);
 
        return eCCGError_None;
 }
@@ -2382,9 +2382,9 @@
        for (i=0; i<numEffectedF; i++)
                effectedF[i]->flags = 0;
 
-       CCGSUBSURF_free(ss, effectedE);
-       CCGSUBSURF_free(ss, effectedV);
-       if(freeF) CCGSUBSURF_free(ss, effectedF);
+       MEM_freeN(effectedE);
+       MEM_freeN(effectedV);
+       if(freeF) MEM_freeN(effectedF);
 
        return eCCGError_None;
 }
@@ -2411,9 +2411,9 @@
        for (i=0; i<numEffectedF; i++)
                effectedF[i]->flags = 0;
 
-       CCGSUBSURF_free(ss, effectedE);
-       CCGSUBSURF_free(ss, effectedV);
-       if(freeF) CCGSUBSURF_free(ss, effectedF);
+       MEM_freeN(effectedE);
+       MEM_freeN(effectedV);
+       if(freeF) MEM_freeN(effectedF);
 
        return eCCGError_None;
 }
@@ -2445,9 +2445,9 @@
        for (i=0; i<numEffectedF; i++)
                effectedF[i]->flags = 0;
 
-       CCGSUBSURF_free(ss, effectedE);
-       CCGSUBSURF_free(ss, effectedV);
-       if(freeF) CCGSUBSURF_free(ss, effectedF);
+       MEM_freeN(effectedE);
+       MEM_freeN(effectedV);
+       if(freeF) MEM_freeN(effectedF);
 
        return eCCGError_None;
 }


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to