From f64ae4cbe5a724496624de9e479c04f325613be5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 2 Dec 2013 17:46:19 +1100 Subject: MemArena: use size_t instead of int for alloc args and internal storage. also add BLI_memarena_calloc to be used when calloc isnt enabled for the arena. --- source/blender/blenkernel/intern/mesh_evaluate.c | 4 +- source/blender/blenlib/BLI_memarena.h | 7 ++-- source/blender/blenlib/intern/BLI_memarena.c | 48 ++++++++++++++-------- source/blender/blenlib/intern/polyfill2d.c | 4 +- .../editors/sculpt_paint/paint_image_proj.c | 6 +-- 5 files changed, 40 insertions(+), 29 deletions(-) diff --git a/source/blender/blenkernel/intern/mesh_evaluate.c b/source/blender/blenkernel/intern/mesh_evaluate.c index adc71e7b65d..0a85d2bfa06 100644 --- a/source/blender/blenkernel/intern/mesh_evaluate.c +++ b/source/blender/blenkernel/intern/mesh_evaluate.c @@ -1387,8 +1387,8 @@ int BKE_mesh_recalc_tessellation(CustomData *fdata, arena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, __func__); } - tris = BLI_memarena_alloc(arena, (int)sizeof(*tris) * totfilltri); - projverts = BLI_memarena_alloc(arena, (int)sizeof(*projverts) * mp->totloop); + tris = BLI_memarena_alloc(arena, sizeof(*tris) * (size_t)totfilltri); + projverts = BLI_memarena_alloc(arena, sizeof(*projverts) * (size_t)mp->totloop); zero_v3(normal); diff --git a/source/blender/blenlib/BLI_memarena.h b/source/blender/blenlib/BLI_memarena.h index 737324ebc16..8d5a7654425 100644 --- a/source/blender/blenlib/BLI_memarena.h +++ b/source/blender/blenlib/BLI_memarena.h @@ -52,12 +52,13 @@ extern "C" { struct MemArena; typedef struct MemArena MemArena; -struct MemArena *BLI_memarena_new(const int bufsize, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(2) ATTR_MALLOC; +struct MemArena *BLI_memarena_new(const size_t bufsize, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(2) ATTR_MALLOC; void BLI_memarena_free(struct MemArena *ma) ATTR_NONNULL(1); void BLI_memarena_use_malloc(struct MemArena *ma) ATTR_NONNULL(1); void BLI_memarena_use_calloc(struct MemArena *ma) ATTR_NONNULL(1); -void BLI_memarena_use_align(struct MemArena *ma, const int align) ATTR_NONNULL(1); -void *BLI_memarena_alloc(struct MemArena *ma, int size) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_ALLOC_SIZE(2); +void BLI_memarena_use_align(struct MemArena *ma, const size_t align) ATTR_NONNULL(1); +void *BLI_memarena_alloc(struct MemArena *ma, size_t size) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_ALLOC_SIZE(2); +void *BLI_memarena_calloc(struct MemArena *ma, size_t size) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC ATTR_ALLOC_SIZE(2); void BLI_memarena_clear(MemArena *ma) ATTR_NONNULL(1); diff --git a/source/blender/blenlib/intern/BLI_memarena.c b/source/blender/blenlib/intern/BLI_memarena.c index 4a6712201a9..ce04ac61ef4 100644 --- a/source/blender/blenlib/intern/BLI_memarena.c +++ b/source/blender/blenlib/intern/BLI_memarena.c @@ -30,10 +30,12 @@ * \ingroup bli */ +#include #include #include "MEM_guardedalloc.h" +#include "BLI_utildefines.h" #include "BLI_memarena.h" #include "BLI_linklist.h" #include "BLI_strict_flags.h" @@ -44,16 +46,16 @@ struct MemArena { unsigned char *curbuf; - int bufsize, cursize; const char *name; + LinkNode *bufs; - int use_calloc; - int align; + size_t bufsize, cursize; + size_t align; - LinkNode *bufs; + bool use_calloc; }; -MemArena *BLI_memarena_new(const int bufsize, const char *name) +MemArena *BLI_memarena_new(const size_t bufsize, const char *name) { MemArena *ma = MEM_callocN(sizeof(*ma), "memarena"); ma->bufsize = bufsize; @@ -77,7 +79,7 @@ void BLI_memarena_use_malloc(MemArena *ma) ma->use_calloc = 0; } -void BLI_memarena_use_align(struct MemArena *ma, const int align) +void BLI_memarena_use_align(struct MemArena *ma, const size_t align) { /* align should be a power of two */ ma->align = align; @@ -102,12 +104,12 @@ static void memarena_curbuf_align(MemArena *ma) { unsigned char *tmp; - tmp = (unsigned char *)PADUP( (intptr_t) ma->curbuf, ma->align); - ma->cursize -= (int)(tmp - ma->curbuf); + tmp = (unsigned char *)PADUP((intptr_t)ma->curbuf, (int)ma->align); + ma->cursize -= (size_t)(tmp - ma->curbuf); ma->curbuf = tmp; } -void *BLI_memarena_alloc(MemArena *ma, int size) +void *BLI_memarena_alloc(MemArena *ma, size_t size) { void *ptr; @@ -119,14 +121,11 @@ void *BLI_memarena_alloc(MemArena *ma, int size) if (size > ma->bufsize - (ma->align - 1)) { ma->cursize = PADUP(size + 1, ma->align); } - else + else { ma->cursize = ma->bufsize; + } - if (ma->use_calloc) - ma->curbuf = MEM_callocN((size_t)ma->cursize, ma->name); - else - ma->curbuf = MEM_mallocN((size_t)ma->cursize, ma->name); - + ma->curbuf = (ma->use_calloc ? MEM_callocN : MEM_mallocN)(ma->cursize, ma->name); BLI_linklist_prepend(&ma->bufs, ma->curbuf); memarena_curbuf_align(ma); } @@ -142,6 +141,19 @@ void *BLI_memarena_alloc(MemArena *ma, int size) return ptr; } +void *BLI_memarena_calloc(MemArena *ma, size_t size) +{ + void *ptr; + + /* no need to use this function call if we're calloc'ing by default */ + BLI_assert(ma->use_calloc == false); + + ptr = BLI_memarena_alloc(ma, size); + memset(ptr, 0, size); + + return ptr; +} + /** * Clear for reuse, avoids re-allocation when an arena may * otherwise be free'd and recreated. @@ -150,7 +162,7 @@ void BLI_memarena_clear(MemArena *ma) { if (ma->bufs) { unsigned char *curbuf_prev; - int curbuf_used; + size_t curbuf_used; if (ma->bufs->next) { BLI_linklist_freeN(ma->bufs->next); @@ -162,11 +174,11 @@ void BLI_memarena_clear(MemArena *ma) memarena_curbuf_align(ma); /* restore to original size */ - curbuf_used = (int)(curbuf_prev - ma->curbuf); + curbuf_used = (size_t)(curbuf_prev - ma->curbuf); ma->cursize += curbuf_used; if (ma->use_calloc) { - memset(ma->curbuf, 0, (size_t)curbuf_used); + memset(ma->curbuf, 0, curbuf_used); } } diff --git a/source/blender/blenlib/intern/polyfill2d.c b/source/blender/blenlib/intern/polyfill2d.c index 088ac761b99..287a0909870 100644 --- a/source/blender/blenlib/intern/polyfill2d.c +++ b/source/blender/blenlib/intern/polyfill2d.c @@ -421,8 +421,8 @@ void BLI_polyfill_calc_arena( struct MemArena *arena) { - unsigned int *indicies = BLI_memarena_alloc(arena, (int)(sizeof(*indicies) * coords_tot)); - eSign *coords_sign = BLI_memarena_alloc(arena, (int)(sizeof(*coords_sign) * coords_tot)); + unsigned int *indicies = BLI_memarena_alloc(arena, sizeof(*indicies) * coords_tot); + eSign *coords_sign = BLI_memarena_alloc(arena, sizeof(*coords_sign) * coords_tot); BLI_polyfill_calc_ex( coords, coords_tot, diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.c b/source/blender/editors/sculpt_paint/paint_image_proj.c index 88cc954fb17..59f398a8719 100644 --- a/source/blender/editors/sculpt_paint/paint_image_proj.c +++ b/source/blender/editors/sculpt_paint/paint_image_proj.c @@ -3294,8 +3294,7 @@ static void project_paint_begin(ProjPaintState *ps) projIma->ima = node->link; projIma->touch = 0; projIma->ibuf = BKE_image_acquire_ibuf(projIma->ima, NULL, NULL); - projIma->partRedrawRect = BLI_memarena_alloc(arena, sizeof(ImagePaintPartialRedraw) * PROJ_BOUNDBOX_SQUARED); - memset(projIma->partRedrawRect, 0, sizeof(ImagePaintPartialRedraw) * PROJ_BOUNDBOX_SQUARED); + projIma->partRedrawRect = BLI_memarena_calloc(arena, sizeof(ImagePaintPartialRedraw) * PROJ_BOUNDBOX_SQUARED); } /* we have built the array, discard the linked list */ @@ -3344,8 +3343,7 @@ static void project_paint_end(ProjPaintState *ps) for (a = 0, last_projIma = ps->projImages; a < ps->image_tot; a++, last_projIma++) { int size = sizeof(void **) * IMAPAINT_TILE_NUMBER(last_projIma->ibuf->x) * IMAPAINT_TILE_NUMBER(last_projIma->ibuf->y); - last_projIma->undoRect = (void **) BLI_memarena_alloc(arena, size); - memset(last_projIma->undoRect, 0, size); + last_projIma->undoRect = (void **) BLI_memarena_calloc(arena, size); last_projIma->ibuf->userflags |= IB_BITMAPDIRTY; } -- cgit v1.2.3