summaryrefslogtreecommitdiff
path: root/includes
diff options
context:
space:
mode:
authorSimon Marlow <simonmar@microsoft.com>2008-01-11 13:54:53 +0000
committerSimon Marlow <simonmar@microsoft.com>2008-01-11 13:54:53 +0000
commit4603b94abac3f36609af5b3b98d34b5b52905c36 (patch)
tree915a6ae2d9ce70e1c5f55601e20ed6586ca021d9 /includes
parent5af1615ff84f5ef7c0db4eff486ed55ee3e4c1c5 (diff)
downloadhaskell-4603b94abac3f36609af5b3b98d34b5b52905c36.tar.gz
recordMutableGen_GC: we must call the spinlocked version of allocBlock()
Diffstat (limited to 'includes')
-rw-r--r--includes/Storage.h19
1 files changed, 18 insertions, 1 deletions
diff --git a/includes/Storage.h b/includes/Storage.h
index 62d57b1d7b..3b3bc1f2f2 100644
--- a/includes/Storage.h
+++ b/includes/Storage.h
@@ -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);
}