recordMutableGen_GC: we must call the spinlocked version of allocBlock()
authorSimon Marlow <simonmar@microsoft.com>
Fri, 11 Jan 2008 13:54:53 +0000 (13:54 +0000)
committerSimon Marlow <simonmar@microsoft.com>
Fri, 11 Jan 2008 13:54:53 +0000 (13:54 +0000)
includes/Storage.h

index 62d57b1..3b3bc1f 100644 (file)
@@ -259,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);
 }