memInventory: optionally dump the memory inventory
[ghc-hetmet.git] / includes / Storage.h
index 48b7ec3..d545054 100644 (file)
@@ -173,9 +173,6 @@ extern bdescr * RTS_VAR(small_alloc_list);
 extern bdescr * RTS_VAR(large_alloc_list);
 extern bdescr * RTS_VAR(pinned_object_block);
 
-extern StgPtr RTS_VAR(alloc_Hp);
-extern StgPtr RTS_VAR(alloc_HpLim);
-
 extern nat RTS_VAR(alloc_blocks);
 extern nat RTS_VAR(alloc_blocks_lim);
 
@@ -262,11 +259,28 @@ recordMutableGenLock(StgClosure *p, generation *gen)
     RELEASE_SM_LOCK;
 }
 
+extern bdescr *allocBlock_sync(void);
+
+// Version of recordMutableGen() for use in parallel GC.  The same as
+// recordMutableGen(), except that we surround it with a spinlock and
+// call the spinlock version of allocBlock().
 INLINE_HEADER void
 recordMutableGen_GC(StgClosure *p, generation *gen)
 {
+    bdescr *bd;
+
     ACQUIRE_SPIN_LOCK(&recordMutableGen_sync);
-    recordMutableGen(p,gen);
+
+    bd = gen->mut_list;
+    if (bd->free >= bd->start + BLOCK_SIZE_W) {
+       bdescr *new_bd;
+       new_bd = allocBlock_sync();
+       new_bd->link = bd;
+       bd = new_bd;
+       gen->mut_list = bd;
+    }
+    *bd->free++ = (StgWord)p;
+
     RELEASE_SPIN_LOCK(&recordMutableGen_sync);
 }
 
@@ -522,11 +536,13 @@ extern void         GetRoots     ( evac_fn evac );
 extern ullong RTS_VAR(total_allocated);
 
 extern lnat calcAllocated  ( void );
-extern lnat calcLive       ( void );
+extern lnat calcLiveBlocks ( void );
+extern lnat calcLiveWords  ( void );
+extern lnat countOccupied  ( bdescr *bd );
 extern lnat calcNeeded     ( void );
 
 #if defined(DEBUG)
-extern void memInventory(void);
+extern void memInventory(rtsBool show);
 extern void checkSanity(void);
 extern nat  countBlocks(bdescr *);
 extern void checkNurserySanity( step *stp );