[project @ 2004-08-13 13:04:50 by simonmar]
[ghc-hetmet.git] / ghc / rts / Storage.c
index 62a383f..367530f 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: Storage.c,v 1.79 2003/03/26 18:59:34 sof Exp $
+ * $Id: Storage.c,v 1.84 2004/08/13 13:11:01 simonmar Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -22,7 +22,6 @@
 #include "Storage.h"
 #include "Schedule.h"
 #include "OSThreads.h"
-#include "StoragePriv.h"
 
 #include "RetainerProfile.h"   // for counting memory blocks (memInventory)
 
@@ -44,7 +43,7 @@ generation *g0                = NULL; /* generation 0, for convenience */
 generation *oldest_gen  = NULL; /* oldest generation, for convenience */
 step *g0s0             = NULL; /* generation 0, step 0, for convenience */
 
-lnat total_allocated = 0;      /* total memory allocated during run */
+ullong total_allocated = 0;    /* total memory allocated during run */
 
 /*
  * Storage manager mutex:  protects all the above state from
@@ -475,15 +474,11 @@ allocate( nat n )
     nat req_blocks =  (lnat)BLOCK_ROUND_UP(n*sizeof(W_)) / BLOCK_SIZE;
     bd = allocGroup(req_blocks);
     dbl_link_onto(bd, &g0s0->large_objects);
+    g0s0->n_large_blocks += req_blocks;
     bd->gen_no  = 0;
     bd->step = g0s0;
     bd->flags = BF_LARGE;
     bd->free = bd->start + n;
-    /* don't add these blocks to alloc_blocks, since we're assuming
-     * that large objects are likely to remain live for quite a while
-     * (eg. running threads), so garbage collecting early won't make
-     * much difference.
-     */
     alloc_blocks += req_blocks;
     RELEASE_SM_LOCK;
     return bd->start;
@@ -588,7 +583,7 @@ allocatePinned( nat n )
        dbl_link_onto(bd, &g0s0->large_objects);
        bd->gen_no = 0;
        bd->step   = g0s0;
-       bd->flags  = BF_LARGE;
+       bd->flags  = BF_PINNED | BF_LARGE;
        bd->free   = bd->start;
        alloc_blocks++;
     }
@@ -625,7 +620,7 @@ stgAllocForGMP (size_t size_in_bytes)
   SET_ARR_HDR(arr, &stg_ARR_WORDS_info, CCCS, data_size_in_words);
   
   /* and return a ptr to the goods inside the array */
-  return(BYTE_ARR_CTS(arr));
+  return arr->payload;
 }
 
 static void *