X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=includes%2FStorage.h;h=3b3bc1f2f2032aeb05bed3f64cabf2013b8f1101;hb=4603b94abac3f36609af5b3b98d34b5b52905c36;hp=62d57b1d7bd3bb68728c754b912e50292ae5a817;hpb=5af1615ff84f5ef7c0db4eff486ed55ee3e4c1c5;p=ghc-hetmet.git 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); }