[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