/* -----------------------------------------------------------------------------
- $Id: Arena.c,v 1.4 2002/07/28 02:31:11 sof Exp $
(c) The University of Glasgow 2001
Arena allocation. Arenas provide fast memory allocation at the
which most allocations are small.
-------------------------------------------------------------------------- */
-#include <stdlib.h>
#include "Rts.h"
#include "RtsUtils.h"
#include "BlockAlloc.h"
#include "Arena.h"
+#include <stdlib.h>
+
// Each arena struct is allocated using malloc().
struct _Arena {
bdescr *current;
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;
-// 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...
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