X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FArena.c;h=76ac23cf88d3e81c65e2208627fefc4c48cb2946;hb=45252b35151fc55aa19fb6770df5ed8267639083;hp=ba6774b39308850592fc1b674fc86eff2516ee4e;hpb=7457757f193b28b5fe8fee01edbed012c2fda897;p=ghc-hetmet.git diff --git a/ghc/rts/Arena.c b/ghc/rts/Arena.c index ba6774b..76ac23c 100644 --- a/ghc/rts/Arena.c +++ b/ghc/rts/Arena.c @@ -1,5 +1,4 @@ /* ----------------------------------------------------------------------------- - $Id: Arena.c,v 1.2 2002/07/17 09:21:49 simonmar Exp $ (c) The University of Glasgow 2001 Arena allocation. Arenas provide fast memory allocation at the @@ -53,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 ) @@ -62,8 +68,11 @@ arenaAlloc( Arena *arena, size_t size ) nat req_blocks; bdescr *bd; - // round up to word size... - size_w = (size + sizeof(W_) - 1) / sizeof(W_); + // round up to nearest alignment chunk. + size = ROUNDUP(size,MIN_ALIGN); + + // 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... @@ -72,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; @@ -100,7 +109,7 @@ arenaFree( Arena *arena ) ASSERT(arena_blocks >= 0); freeGroup(bd); } - free(arena); + stgFree(arena); } unsigned long