/* -----------------------------------------------------------------------------
- $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
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 )
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...
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;
ASSERT(arena_blocks >= 0);
freeGroup(bd);
}
- free(arena);
+ stgFree(arena);
}
unsigned long