[project @ 2002-07-26 09:35:46 by simonmar]
authorsimonmar <unknown>
Fri, 26 Jul 2002 09:35:46 +0000 (09:35 +0000)
committersimonmar <unknown>
Fri, 26 Jul 2002 09:35:46 +0000 (09:35 +0000)
Always return 8-byte-aligned memory from arenaAlloc().  Fixes problems
with profiling on sparc-sun-solaris2, and might fix problems with
Windows too.

MERGE

ghc/rts/Arena.c

index ba6774b..87145ae 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.3 2002/07/26 09:35:46 simonmar Exp $ 
    (c) The University of Glasgow 2001
 
    Arena allocation.  Arenas provide fast memory allocation at the
@@ -24,8 +24,6 @@
 #include "BlockAlloc.h"
 #include "Arena.h"
 
-#include <stdlib.h>
-
 // Each arena struct is allocated using malloc().
 struct _Arena {
     bdescr *current;
@@ -62,8 +60,12 @@ arenaAlloc( Arena *arena, size_t size )
     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...