X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FArena.c;h=ea109accbf1e84610c978d0c4694e0263ce19ebc;hb=6a5ea4c513a58d733e8b109943dbf07038e08b02;hp=cc18e4e95bc8c6ae1a935c5406dce785c95220d6;hpb=91d3350899fd0d65a21a9abce9c5f2318ffe3fd0;p=ghc-hetmet.git diff --git a/ghc/rts/Arena.c b/ghc/rts/Arena.c index cc18e4e..ea109ac 100644 --- a/ghc/rts/Arena.c +++ b/ghc/rts/Arena.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - $Id: Arena.c,v 1.4 2002/07/28 02:31:11 sof Exp $ + $Id: Arena.c,v 1.6 2003/03/25 17:58:47 sof Exp $ (c) The University of Glasgow 2001 Arena allocation. Arenas provide fast memory allocation at the @@ -52,6 +52,13 @@ newArena( void ) return arena; } +// The minimum alignment of an allocated block. +#define MIN_ALIGN 8 + +/* 'n' is assumed to be a power of 2 */ +#define ROUNDUP(x,n) (((x)+((n)-1))&(~((n)-1))) +#define B_TO_W(x) ((x) / sizeof(W_)) + // Allocate some memory in an arena void * arenaAlloc( Arena *arena, size_t size ) @@ -61,12 +68,11 @@ arenaAlloc( Arena *arena, size_t size ) nat req_blocks; bdescr *bd; -// The minimum alignment of an allocated block. -#define MIN_ALIGN 8 + // round up to nearest alignment chunk. + size = ROUNDUP(size,MIN_ALIGN); - // size of allocated block in words, rounded up to the nearest - // alignment chunk. - size_w = ((size + MIN_ALIGN - 1) / MIN_ALIGN) * (MIN_ALIGN/sizeof(W_)); + // size of allocated block in words. + size_w = B_TO_W(size); if ( arena->free + size_w < arena->lim ) { // enough room in the current block... @@ -75,7 +81,7 @@ arenaAlloc( Arena *arena, size_t size ) return p; } else { // allocate a fresh block... - req_blocks = (lnat)BLOCK_ROUND_UP(size_w*sizeof(W_)) / BLOCK_SIZE; + req_blocks = (lnat)BLOCK_ROUND_UP(size) / BLOCK_SIZE; bd = allocGroup(req_blocks); arena_blocks += req_blocks; @@ -103,7 +109,7 @@ arenaFree( Arena *arena ) ASSERT(arena_blocks >= 0); freeGroup(bd); } - free(arena); + stgFree(arena); } unsigned long