[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41932] trunk/blender/source/blender: merge mempool changes from bmesh (adds mempool iterator).
Dalai Felinto
dfelinto at gmail.com
Wed Nov 16 23:06:50 CET 2011
Hi,
This commit broke building in OSX with CMake + Unix Makefiles:
http://www.pasteall.org/26489
No time to look at that now, I hope someone can figure out the fix for it ;)
--
Dalai
2011/11/16 Campbell Barton <ideasman42 at gmail.com>:
> 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. @@
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
More information about the Bf-committers
mailing list