[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41932] trunk/blender/source/blender: merge mempool changes from bmesh (adds mempool iterator).

Campbell Barton ideasman42 at gmail.com
Wed Nov 16 20:31:42 CET 2011


Revision: 41932
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41932
Author:   campbellbarton
Date:     2011-11-16 19:31:42 +0000 (Wed, 16 Nov 2011)
Log Message:
-----------
merge mempool changes from bmesh (adds mempool iterator).

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/BME_Customdata.c
    trunk/blender/source/blender/blenkernel/intern/BME_mesh.c
    trunk/blender/source/blender/blenkernel/intern/customdata.c
    trunk/blender/source/blender/blenlib/BLI_mempool.h
    trunk/blender/source/blender/blenlib/intern/BLI_ghash.c
    trunk/blender/source/blender/blenlib/intern/BLI_mempool.c
    trunk/blender/source/blender/imbuf/intern/moviecache.c

Modified: trunk/blender/source/blender/blenkernel/intern/BME_Customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/BME_Customdata.c	2011-11-16 19:26:11 UTC (rev 41931)
+++ trunk/blender/source/blender/blenkernel/intern/BME_Customdata.c	2011-11-16 19:31:42 UTC (rev 41932)
@@ -86,7 +86,7 @@
 	if(data->totlayer){
 		/*alloc memory*/
 		data->layers = MEM_callocN(sizeof(BME_CustomDataLayer)*data->totlayer, "BMesh Custom Data Layers");
-		data->pool = BLI_mempool_create(data->totsize, initalloc, initalloc, 0);
+		data->pool = BLI_mempool_create(data->totsize, initalloc, initalloc, FALSE, FALSE);
 		/*initialize layer data*/
 		for(i=0; i < BME_CD_NUMTYPES; i++){
 			if(init->layout[i]){

Modified: trunk/blender/source/blender/blenkernel/intern/BME_mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/BME_mesh.c	2011-11-16 19:26:11 UTC (rev 41931)
+++ trunk/blender/source/blender/blenkernel/intern/BME_mesh.c	2011-11-16 19:31:42 UTC (rev 41932)
@@ -55,10 +55,10 @@
 	/*allocate the structure*/
 	BME_Mesh *bm = MEM_callocN(sizeof(BME_Mesh),"BMesh");
 	/*allocate the memory pools for the mesh elements*/
-	bm->vpool = BLI_mempool_create(sizeof(BME_Vert), allocsize[0], allocsize[0], 0);
-	bm->epool = BLI_mempool_create(sizeof(BME_Edge), allocsize[1], allocsize[1], 0);
-	bm->lpool = BLI_mempool_create(sizeof(BME_Loop), allocsize[2], allocsize[2], 0);
-	bm->ppool = BLI_mempool_create(sizeof(BME_Poly), allocsize[3], allocsize[3], 0);
+	bm->vpool = BLI_mempool_create(sizeof(BME_Vert), allocsize[0], allocsize[0], FALSE, FALSE);
+	bm->epool = BLI_mempool_create(sizeof(BME_Edge), allocsize[1], allocsize[1], FALSE, FALSE);
+	bm->lpool = BLI_mempool_create(sizeof(BME_Loop), allocsize[2], allocsize[2], FALSE, FALSE);
+	bm->ppool = BLI_mempool_create(sizeof(BME_Poly), allocsize[3], allocsize[3], FALSE, FALSE);
 	return bm;
 }
 /*	

Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c	2011-11-16 19:26:11 UTC (rev 41931)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c	2011-11-16 19:31:42 UTC (rev 41932)
@@ -2009,7 +2009,7 @@
 
 
 void CustomData_bmesh_init_pool(CustomData *data, int allocsize){
-	if(data->totlayer)data->pool = BLI_mempool_create(data->totsize, allocsize, allocsize, 0);
+	if(data->totlayer)data->pool = BLI_mempool_create(data->totsize, allocsize, allocsize, FALSE, FALSE);
 }
 
 void CustomData_bmesh_free_block(CustomData *data, void **block)

Modified: trunk/blender/source/blender/blenlib/BLI_mempool.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_mempool.h	2011-11-16 19:26:11 UTC (rev 41931)
+++ trunk/blender/source/blender/blenlib/BLI_mempool.h	2011-11-16 19:31:42 UTC (rev 41932)
@@ -34,12 +34,45 @@
  *  \brief Simple fast memory allocator.
  */
 
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
 struct BLI_mempool;
+struct BLI_mempool_chunk;
 
-struct BLI_mempool *BLI_mempool_create(int esize, int tote, int pchunk, int use_sysmalloc);
-void *BLI_mempool_alloc(struct BLI_mempool *pool);
-void *BLI_mempool_calloc(struct BLI_mempool *pool);
-void BLI_mempool_free(struct BLI_mempool *pool, void *addr);
-void BLI_mempool_destroy(struct BLI_mempool *pool);
+typedef struct BLI_mempool BLI_mempool;
 
+/*allow_iter allows iteration on this mempool.  note: this requires that the
+  first four bytes of the elements never contain the character string
+  'free'.  use with care.*/
+
+BLI_mempool *BLI_mempool_create(int esize, int tote, int pchunk,
+                                short use_sysmalloc, short allow_iter);
+void *BLI_mempool_alloc(BLI_mempool *pool);
+void *BLI_mempool_calloc(BLI_mempool *pool);
+void BLI_mempool_free(BLI_mempool *pool, void *addr);
+void BLI_mempool_destroy(BLI_mempool *pool);
+int BLI_mempool_count(BLI_mempool *pool);
+
+/** iteration stuff.  note: this may easy to produce bugs with **/
+/*private structure*/
+typedef struct BLI_mempool_iter {
+	BLI_mempool *pool;
+	struct BLI_mempool_chunk *curchunk;
+	int curindex;
+} BLI_mempool_iter;
+
+/*allow iteration on this mempool.  note: this requires that the
+  first four bytes of the elements never contain the character string
+  'free'.  use with care.*/
+void BLI_mempool_allow_iter(BLI_mempool *pool);
+void BLI_mempool_iternew(BLI_mempool *pool, BLI_mempool_iter *iter);
+void *BLI_mempool_iterstep(BLI_mempool_iter *iter);
+
+#ifdef __cplusplus
+}
 #endif
+
+#endif

Modified: trunk/blender/source/blender/blenlib/intern/BLI_ghash.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/BLI_ghash.c	2011-11-16 19:26:11 UTC (rev 41931)
+++ trunk/blender/source/blender/blenlib/intern/BLI_ghash.c	2011-11-16 19:31:42 UTC (rev 41932)
@@ -60,7 +60,7 @@
 	GHash *gh= MEM_mallocN(sizeof(*gh), info);
 	gh->hashfp= hashfp;
 	gh->cmpfp= cmpfp;
-	gh->entrypool = BLI_mempool_create(sizeof(Entry), 64, 64, 0);
+	gh->entrypool = BLI_mempool_create(sizeof(Entry), 64, 64, FALSE, FALSE);
 
 	gh->cursize= 0;
 	gh->nentries= 0;

Modified: trunk/blender/source/blender/blenlib/intern/BLI_mempool.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/BLI_mempool.c	2011-11-16 19:26:11 UTC (rev 41931)
+++ trunk/blender/source/blender/blenlib/intern/BLI_mempool.c	2011-11-16 19:31:42 UTC (rev 41932)
@@ -20,7 +20,7 @@
  *
  * The Original Code is: all of this file.
  *
- * Contributor(s): none yet.
+ * Contributor(s): Geoffery Bantle
  *
  * ***** END GPL LICENSE BLOCK *****
  */
@@ -29,18 +29,36 @@
  *  \ingroup bli
  */
 
-
 /*
-	Simple, fast memory allocator for allocating many elements of the same size.
-*/
+ * Simple, fast memory allocator for allocating many elements of the same size.
+ */
 
+#include "BLI_utildefines.h"
+#include "BLI_listbase.h"
+
+#include "BLI_mempool.h" /* own include */
+
+#include "DNA_listBase.h"
+
 #include "MEM_guardedalloc.h"
-#include "BLI_blenlib.h"
-#include "BLI_mempool.h"
-#include <string.h> 
 
+#include <string.h>
+#include <stdlib.h>
+
+/* note: copied from BKE_utildefines.h, dont use here because we're in BLI */
+#ifdef __BIG_ENDIAN__
+/* Big Endian */
+#  define MAKE_ID(a,b,c,d) ( (int)(a)<<24 | (int)(b)<<16 | (c)<<8 | (d) )
+#else
+/* Little Endian */
+#  define MAKE_ID(a,b,c,d) ( (int)(d)<<24 | (int)(c)<<16 | (b)<<8 | (a) )
+#endif
+
+#define FREEWORD MAKE_ID('f', 'r', 'e', 'e')
+
 typedef struct BLI_freenode {
 	struct BLI_freenode *next;
+	int freeword; /* used to identify this as a freed node */
 } BLI_freenode;
 
 typedef struct BLI_mempool_chunk {
@@ -50,33 +68,42 @@
 
 typedef struct BLI_mempool {
 	struct ListBase chunks;
-	int esize, csize, pchunk;		/*size of elements and chunks in bytes and number of elements per chunk*/
-	struct BLI_freenode	*free;		/*free element list. Interleaved into chunk datas.*/
-	int totalloc, totused; /*total number of elements allocated in total, and currently in use*/
-	int use_sysmalloc;
+	int esize, csize, pchunk;        /* size of elements and chunks in bytes
+	                                  * and number of elements per chunk*/
+	short use_sysmalloc, allow_iter;
+	/* keeps aligned to 16 bits */
+
+	BLI_freenode *free;	             /* free element list. Interleaved into chunk datas.*/
+	int totalloc, totused;           /* total number of elements allocated in total,
+	                                  * and currently in use*/
 } BLI_mempool;
 
-BLI_mempool *BLI_mempool_create(int esize, int tote, int pchunk, int use_sysmalloc)
+#define MEMPOOL_ELEM_SIZE_MIN (sizeof(void *) * 2)
+
+BLI_mempool *BLI_mempool_create(int esize, int tote, int pchunk,
+                                short use_sysmalloc, short allow_iter)
 {
 	BLI_mempool  *pool = NULL;
 	BLI_freenode *lasttail = NULL, *curnode = NULL;
 	int i,j, maxchunks;
 	char *addr;
-	
-	if (esize < sizeof(void*))
-		esize = sizeof(void*);
-	
+
+	if (esize < MEMPOOL_ELEM_SIZE_MIN)
+		esize = MEMPOOL_ELEM_SIZE_MIN;
+
 	/*allocate the pool structure*/
 	pool = use_sysmalloc ? malloc(sizeof(BLI_mempool)) : MEM_mallocN(sizeof(BLI_mempool), "memory pool");
-	pool->esize = esize;
+	pool->esize = allow_iter ? MAX2(esize, sizeof(BLI_freenode)) : esize;
 	pool->use_sysmalloc = use_sysmalloc;
 	pool->pchunk = pchunk;
 	pool->csize = esize * pchunk;
 	pool->chunks.first = pool->chunks.last = NULL;
 	pool->totused= 0;
+	pool->allow_iter= allow_iter;
 	
 	maxchunks = tote / pchunk + 1;
-	
+	if (maxchunks==0) maxchunks = 1;
+
 	/*allocate the actual chunks*/
 	for (i=0; i < maxchunks; i++) {
 		BLI_mempool_chunk *mpchunk = use_sysmalloc ? malloc(sizeof(BLI_mempool_chunk)) : MEM_mallocN(sizeof(BLI_mempool_chunk), "BLI_Mempool Chunk");
@@ -84,15 +111,30 @@
 		mpchunk->data = use_sysmalloc ? malloc(pool->csize) : MEM_mallocN(pool->csize, "BLI Mempool Chunk Data");
 		BLI_addtail(&(pool->chunks), mpchunk);
 		
-		if (i==0) pool->free = mpchunk->data; /*start of the list*/
+		if (i==0) {
+			pool->free = mpchunk->data; /*start of the list*/
+			if (pool->allow_iter)
+				pool->free->freeword = FREEWORD;
+		}
+
 		/*loop through the allocated data, building the pointer structures*/
 		for (addr = mpchunk->data, j=0; j < pool->pchunk; j++) {
 			curnode = ((BLI_freenode*)addr);
 			addr += pool->esize;
 			curnode->next = (BLI_freenode*)addr;
+			if (pool->allow_iter) {
+				if (j != pool->pchunk-1)
+					curnode->next->freeword = FREEWORD;
+				curnode->freeword = FREEWORD;
+			}
 		}
 		/*final pointer in the previously allocated chunk is wrong.*/
-		if (lasttail) lasttail->next = mpchunk->data;
+		if (lasttail) {
+			lasttail->next = mpchunk->data;
+			if (pool->allow_iter)
+				lasttail->freeword = FREEWORD;
+		}
+
 		/*set the end of this chunks memoryy to the new tail for next iteration*/
 		lasttail = curnode;
 
@@ -121,10 +163,18 @@
 		BLI_addtail(&(pool->chunks), mpchunk);
 
 		pool->free = mpchunk->data; /*start of the list*/
-		for (addr = mpchunk->data, j=0; j < pool->pchunk; j++) {
+		if (pool->allow_iter)
+			pool->free->freeword = FREEWORD;
+		for(addr = mpchunk->data, j=0; j < pool->pchunk; j++){
 			curnode = ((BLI_freenode*)addr);
 			addr += pool->esize;
 			curnode->next = (BLI_freenode*)addr;
+
+			if (pool->allow_iter) {
+				curnode->freeword = FREEWORD;

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list