[project @ 2004-02-12 02:04:59 by mthomas]
[ghc-hetmet.git] / ghc / rts / Arena.c
index 87145ae..ea109ac 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
-   $Id: Arena.c,v 1.3 2002/07/26 09:35:46 simonmar 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
@@ -19,6 +19,7 @@
    which most allocations are small.
    -------------------------------------------------------------------------- */
 
+#include <stdlib.h>
 #include "Rts.h"
 #include "RtsUtils.h"
 #include "BlockAlloc.h"
@@ -51,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 )
@@ -60,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...
@@ -74,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;
 
@@ -102,7 +109,7 @@ arenaFree( Arena *arena )
        ASSERT(arena_blocks >= 0);
        freeGroup(bd);
     }
-    free(arena);
+    stgFree(arena);
 }
 
 unsigned long