[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