[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