[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40521] branches/bmesh/blender/source/ blender/blenlib/intern/scanfill.c: optimization for scanfill allocation function.

Campbell Barton ideasman42 at gmail.com
Sat Sep 24 18:38:02 CEST 2011


Revision: 40521
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40521
Author:   campbellbarton
Date:     2011-09-24 16:38:02 +0000 (Sat, 24 Sep 2011)
Log Message:
-----------
optimization for scanfill allocation function.
- replace "size= 4*( (size+3)/4 );" with "size = (size + 3 ) & ~3;"
- split new_mem_element into 2 functions, one to reset, another to allocate so allocating isnt checking to reset each time.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c

Modified: branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c	2011-09-24 16:17:23 UTC (rev 40520)
+++ branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c	2011-09-24 16:38:02 UTC (rev 40521)
@@ -145,63 +145,58 @@
    only to be used within loops, and not by one function at a time
    free in the end, with argument '-1'
 */
+#define MEM_ELEM_BLOCKSIZE 16384
+static struct mem_elements *  melem__cur= 0;
+static int                    melem__offs= 0; /* the current free address */
+static ListBase               melem__lb= {NULL, NULL};
 
-static void *new_mem_element(int size)
+static void *mem_element_new(int size)
 {
-	int blocksize= 16384;
-	static int offs= 0;		/* the current free address */
-	static struct mem_elements *cur= 0, *first;
-	static ListBase lb= {0, 0};
-	void *adr;
+	BLI_assert(size>10000 || size==0); /* this is invalid use! */
+
+	size = (size + 3 ) & ~3; 	/* allocate in units of 4 */
 	
-	if(size>10000 || size==0) {
-		printf("incorrect use of new_mem_element\n");
+	if(melem__cur && (size + melem__offs < MEM_ELEM_BLOCKSIZE)) {
+		void *adr= (void *) (melem__cur->data+melem__offs);
+		 melem__offs+= size;
+		return adr;
 	}
-	else if(size== -1) {
-		/*BMESH_TODO: keep the first block, gives memory leak on exit with 'newmem' */
+	else {
+		melem__cur= MEM_callocN( sizeof(struct mem_elements), "newmem");
+		melem__cur->data= MEM_callocN(MEM_ELEM_BLOCKSIZE, "newmem");
+		BLI_addtail(&melem__lb, melem__cur);
 
-		if((first= lb.first)) { /* can be false if first fill fails */
-			BLI_remlink(&lb, first);
+		melem__offs= size;
+		return melem__cur->data;
+	}
+}
+static void mem_element_reset(void)
+{
+	struct mem_elements *first;
+	/*BMESH_TODO: keep the first block, gives memory leak on exit with 'newmem' */
 
-			cur= lb.first;
-			while(cur) {
-				MEM_freeN(cur->data);
-				cur= cur->next;
-			}
-			BLI_freelistN(&lb);
+	if((first= melem__lb.first)) { /* can be false if first fill fails */
+		BLI_remlink(&melem__lb, first);
 
-			/*reset the block we're keeping*/
-			BLI_addtail(&lb, first);
-			memset(first->data, 0, blocksize);
+		melem__cur= melem__lb.first;
+		while(melem__cur) {
+			MEM_freeN(melem__cur->data);
+			melem__cur= melem__cur->next;
 		}
+		BLI_freelistN(&melem__lb);
 
-		cur= first;
-		offs= 0;
-
-		return NULL;	
+		/*reset the block we're keeping*/
+		BLI_addtail(&melem__lb, first);
+		memset(first->data, 0, MEM_ELEM_BLOCKSIZE);
 	}
-	
-	size= 4*( (size+3)/4 );
-	
-	if(cur) {
-		if(size+offs < blocksize) {
-			adr= (void *) (cur->data+offs);
-			 offs+= size;
-			return adr;
-		}
-	}
-	
-	cur= MEM_callocN( sizeof(struct mem_elements), "newmem");
-	cur->data= MEM_callocN(blocksize, "newmem");
-	BLI_addtail(&lb, cur);
-	
-	offs= size;
-	return cur->data;
+
+	melem__cur= first;
+	melem__offs= 0;
 }
 
 void BLI_end_edgefill(void)
 {
-	new_mem_element(-1);
+	mem_element_reset();
 	
 	fillvertbase.first= fillvertbase.last= 0;
 	filledgebase.first= filledgebase.last= 0;
@@ -216,7 +211,7 @@
 {
 	EditVert *eve;
 	
-	eve= new_mem_element(sizeof(EditVert));
+	eve= mem_element_new(sizeof(EditVert));
 	BLI_addtail(&fillvertbase, eve);
 	
 	eve->co[0] = vec[0];
@@ -230,7 +225,7 @@
 {
 	EditEdge *newed;
 
-	newed= new_mem_element(sizeof(EditEdge));
+	newed= mem_element_new(sizeof(EditEdge));
 	BLI_addtail(&filledgebase, newed);
 	
 	newed->v1= v1;
@@ -244,7 +239,7 @@
 	/* does not make edges */
 	EditFace *evl;
 
-	evl= new_mem_element(sizeof(EditFace));
+	evl= mem_element_new(sizeof(EditFace));
 	BLI_addtail(&fillfacebase, evl);
 	
 	evl->v1= v1;




More information about the Bf-blender-cvs mailing list