From: Simon Marlow Date: Fri, 11 Jan 2008 13:54:53 +0000 (+0000) Subject: recordMutableGen_GC: we must call the spinlocked version of allocBlock() X-Git-Tag: Before_cabalised-GHC~259 X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=4603b94abac3f36609af5b3b98d34b5b52905c36 recordMutableGen_GC: we must call the spinlocked version of allocBlock() --- diff --git a/includes/Storage.h b/includes/Storage.h index 62d57b1..3b3bc1f 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); }