X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FGCUtils.h;h=3fe78a33100f297dc66b9de4bcc81011da497d10;hb=329077220af83860d5dd6891649cb1058b5bbaa6;hp=34657c23d37a00a2103ad9e85ff3ddd4f12100d4;hpb=dbbf15c0f141357aa49b583286174867baadb821;p=ghc-hetmet.git diff --git a/rts/sm/GCUtils.h b/rts/sm/GCUtils.h index 34657c2..3fe78a3 100644 --- a/rts/sm/GCUtils.h +++ b/rts/sm/GCUtils.h @@ -1,6 +1,6 @@ /* ---------------------------------------------------------------------------- * - * (c) The GHC Team 1998-2006 + * (c) The GHC Team 1998-2008 * * Generational garbage collector: utilities * @@ -11,19 +11,22 @@ * * --------------------------------------------------------------------------*/ -#include "SMP.h" +#ifndef SM_GCUTILS_H +#define SM_GCUTILS_H -#ifdef THREADED_RTS -extern SpinLock gc_alloc_block_sync; -#endif +#include "BeginPrivate.h" bdescr *allocBlock_sync(void); void freeChain_sync(bdescr *bd); -void push_scanned_block (bdescr *bd, step_workspace *ws); -bdescr *grab_todo_block (step_workspace *ws); -StgPtr todo_block_full (nat size, step_workspace *ws); -StgPtr alloc_todo_block (step_workspace *ws, nat size); +void push_scanned_block (bdescr *bd, gen_workspace *ws); +StgPtr todo_block_full (nat size, gen_workspace *ws); +StgPtr alloc_todo_block (gen_workspace *ws, nat size); + +bdescr *grab_local_todo_block (gen_workspace *ws); +#if defined(THREADED_RTS) +bdescr *steal_todo_block (nat s); +#endif // Returns true if a block is partially full. This predicate is used to try // to re-use partial blocks wherever possible, and to reduce wastage. @@ -36,5 +39,28 @@ isPartiallyFull(bdescr *bd) #if DEBUG -void printMutableList (generation *gen); +void printMutableList (bdescr *bd); #endif + +// Version of recordMutableGen for use during GC. This uses the +// mutable lists attached to the current gc_thread structure, which +// are the same as the mutable lists on the Capability. +INLINE_HEADER void +recordMutableGen_GC (StgClosure *p, nat gen_no) +{ + bdescr *bd; + + bd = gct->mut_lists[gen_no]; + if (bd->free >= bd->start + BLOCK_SIZE_W) { + bdescr *new_bd; + new_bd = allocBlock_sync(); + new_bd->link = bd; + bd = new_bd; + gct->mut_lists[gen_no] = bd; + } + *bd->free++ = (StgWord)p; +} + +#include "EndPrivate.h" + +#endif /* SM_GCUTILS_H */