[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26710] trunk/blender/source/blender/ blenkernel/intern/CCGSubSurf.c: Fix for a memory leak in subsurf code that is using memory arena, temporary
Brecht Van Lommel
brecht at blender.org
Mon Feb 8 16:01:12 CET 2010
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;
}
More information about the Bf-blender-cvs
mailing list