diff options
author | Simon Marlow <simonmar@microsoft.com> | 2008-01-11 13:54:53 +0000 |
---|---|---|
committer | Simon Marlow <simonmar@microsoft.com> | 2008-01-11 13:54:53 +0000 |
commit | 4603b94abac3f36609af5b3b98d34b5b52905c36 (patch) | |
tree | 915a6ae2d9ce70e1c5f55601e20ed6586ca021d9 /includes | |
parent | 5af1615ff84f5ef7c0db4eff486ed55ee3e4c1c5 (diff) | |
download | haskell-4603b94abac3f36609af5b3b98d34b5b52905c36.tar.gz |
recordMutableGen_GC: we must call the spinlocked version of allocBlock()
Diffstat (limited to 'includes')
-rw-r--r-- | includes/Storage.h | 19 |
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); } |