A small GC optimisation
[ghc-hetmet.git] / rts / Arena.c
index b2b5ce2..653eb69 100644 (file)
    which most allocations are small.
    -------------------------------------------------------------------------- */
 
+#include "PosixSource.h"
 #include "Rts.h"
+
 #include "RtsUtils.h"
 #include "Arena.h"
 
-#include <stdlib.h>
-
 // Each arena struct is allocated using malloc().
 struct _Arena {
     bdescr *current;
@@ -42,7 +42,7 @@ newArena( void )
     Arena *arena;
 
     arena = stgMallocBytes(sizeof(Arena), "newArena");
-    arena->current = allocBlock();
+    arena->current = allocBlock_lock();
     arena->current->link = NULL;
     arena->free = arena->current->start;
     arena->lim  = arena->current->start + BLOCK_SIZE_W;
@@ -81,11 +81,12 @@ arenaAlloc( Arena *arena, size_t size )
     } else {
        // allocate a fresh block...
        req_blocks =  (lnat)BLOCK_ROUND_UP(size) / BLOCK_SIZE;
-       bd = allocGroup(req_blocks);
+       bd = allocGroup_lock(req_blocks);
        arena_blocks += req_blocks;
 
        bd->gen_no  = 0;
-       bd->step    = NULL;
+       bd->gen     = NULL;
+        bd->dest_no = 0;
        bd->flags   = 0;
        bd->free    = bd->start;
        bd->link    = arena->current;
@@ -106,7 +107,7 @@ arenaFree( Arena *arena )
        next = bd->link;
        arena_blocks -= bd->blocks;
        ASSERT(arena_blocks >= 0);
-       freeGroup(bd);
+       freeGroup_lock(bd);
     }
     stgFree(arena);
 }