[project @ 2002-11-21 03:34:07 by chak]
[ghc-hetmet.git] / ghc / rts / Arena.c
index ba6774b..cc18e4e 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
 /* -----------------------------------------------------------------------------
-   $Id: Arena.c,v 1.2 2002/07/17 09:21:49 simonmar Exp $ 
+   $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
    (c) The University of Glasgow 2001
 
    Arena allocation.  Arenas provide fast memory allocation at the
    which most allocations are small.
    -------------------------------------------------------------------------- */
 
    which most allocations are small.
    -------------------------------------------------------------------------- */
 
+#include <stdlib.h>
 #include "Rts.h"
 #include "RtsUtils.h"
 #include "BlockAlloc.h"
 #include "Arena.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;
 // Each arena struct is allocated using malloc().
 struct _Arena {
     bdescr *current;
@@ -62,8 +61,12 @@ arenaAlloc( Arena *arena, size_t size )
     nat req_blocks;
     bdescr *bd;
 
     nat req_blocks;
     bdescr *bd;
 
-    // round up to word size...
-    size_w = (size + sizeof(W_) - 1) / sizeof(W_);
+// The minimum alignment of an allocated block.
+#define MIN_ALIGN 8
+
+    // 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_));
 
     if ( arena->free + size_w < arena->lim ) {
        // enough room in the current block...
 
     if ( arena->free + size_w < arena->lim ) {
        // enough room in the current block...