45
43
#include <string.h>
46
44
#include <stdlib.h>
48
/* note: copied from BKE_utildefines.h, don't use here because we're in BLI */
46
/* note: copied from BLO_blend_defs.h, don't use here because we're in BLI */
49
47
#ifdef __BIG_ENDIAN__
51
# define MAKE_ID(a,b,c,d) ( (int)(a)<<24 | (int)(b)<<16 | (c)<<8 | (d) )
49
# define MAKE_ID(a, b, c, d) ( (int)(a) << 24 | (int)(b) << 16 | (c) << 8 | (d) )
53
51
/* Little Endian */
54
# define MAKE_ID(a,b,c,d) ( (int)(d)<<24 | (int)(c)<<16 | (b)<<8 | (a) )
52
# define MAKE_ID(a, b, c, d) ( (int)(d) << 24 | (int)(c) << 16 | (b) << 8 | (a) )
57
55
#define FREEWORD MAKE_ID('f', 'r', 'e', 'e')
57
/* currently totalloc isnt used */
58
// #define USE_TOTALLOC
59
60
typedef struct BLI_freenode {
60
61
struct BLI_freenode *next;
61
62
int freeword; /* used to identify this as a freed node */
240
/* doesnt protect against double frees, don't be stupid! */
245
* Free an element from the mempool.
247
* \note doesnt protect against double frees, don't be stupid!
241
249
void BLI_mempool_free(BLI_mempool *pool, void *addr)
243
251
BLI_freenode *newhead = addr;
245
253
if (pool->flag & BLI_MEMPOOL_ALLOW_ITER) {
255
/* this will detect double free's */
256
BLI_assert(newhead->freeword != FREEWORD);
246
258
newhead->freeword = FREEWORD;
278
290
BLI_addtail(&pool->chunks, first);
279
292
pool->totalloc = pool->pchunk;
281
295
pool->free = first->data; /* start of the list */
282
296
for (tmpaddr = first->data, i = 0; i < pool->pchunk; i++) {
296
310
void *BLI_mempool_findelem(BLI_mempool *pool, int index)
298
if (!(pool->flag & BLI_MEMPOOL_ALLOW_ITER)) {
299
fprintf(stderr, "%s: Error! you can't iterate over this mempool!\n", __func__);
302
else if ((index >= 0) && (index < pool->totused)) {
312
BLI_assert(pool->flag & BLI_MEMPOOL_ALLOW_ITER);
314
if ((index >= 0) && (index < pool->totused)) {
303
315
/* we could have some faster mem chunk stepping code inline */
304
316
BLI_mempool_iter iter;
306
318
BLI_mempool_iternew(pool, &iter);
307
319
for (elem = BLI_mempool_iterstep(&iter); index-- != 0; elem = BLI_mempool_iterstep(&iter)) {
329
* \param data array of pointers at least the size of 'pool->totused'
331
void BLI_mempool_as_array(BLI_mempool *pool, void **data)
333
BLI_mempool_iter iter;
336
BLI_assert(pool->flag & BLI_MEMPOOL_ALLOW_ITER);
337
BLI_mempool_iternew(pool, &iter);
338
for (elem = BLI_mempool_iterstep(&iter); elem; elem = BLI_mempool_iterstep(&iter)) {
341
BLI_assert((p - data) == pool->totused);
345
* Allocate an array from the mempool.
347
void *BLI_mempool_as_arrayN(BLI_mempool *pool, const char *allocstr)
349
void *data = MEM_mallocN(BLI_mempool_count(pool) * pool->esize, allocstr);
350
BLI_mempool_as_array(pool, data);
316
354
void BLI_mempool_iternew(BLI_mempool *pool, BLI_mempool_iter *iter)
318
if (!(pool->flag & BLI_MEMPOOL_ALLOW_ITER)) {
319
fprintf(stderr, "%s: Error! you can't iterate over this mempool!\n", __func__);
320
iter->curchunk = NULL;
356
BLI_assert(pool->flag & BLI_MEMPOOL_ALLOW_ITER);
326
358
iter->pool = pool;
327
359
iter->curchunk = pool->chunks.first;