X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FGCUtils.h;h=e71f4374fb012c9dc88fce914761312ea9c4a50f;hb=e562d3a5cefc282213f64f2a3111007ef7987c8b;hp=32810b64102bd5b57b150b9721eba214eb3db34f;hpb=a370654a872838c43e63bdd6cc279c0ee9913cdf;p=ghc-hetmet.git diff --git a/rts/sm/GCUtils.h b/rts/sm/GCUtils.h index 32810b6..e71f437 100644 --- a/rts/sm/GCUtils.h +++ b/rts/sm/GCUtils.h @@ -17,10 +17,12 @@ 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); +bdescr *grab_local_todo_block (step_workspace *ws); +bdescr *steal_todo_block (nat s); + // 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. // We might need to tweak the actual value. @@ -34,3 +36,22 @@ isPartiallyFull(bdescr *bd) #if DEBUG void printMutableList (generation *gen); #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; +}