X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FGCUtils.h;h=34657c23d37a00a2103ad9e85ff3ddd4f12100d4;hb=dbbf15c0f141357aa49b583286174867baadb821;hp=70dd7a882fce5f74db7ecb2eb6a1b5586dedc642;hpb=64c17c4561cf419a4c70511bafc0815ea670bb2e;p=ghc-hetmet.git diff --git a/rts/sm/GCUtils.h b/rts/sm/GCUtils.h index 70dd7a8..34657c2 100644 --- a/rts/sm/GCUtils.h +++ b/rts/sm/GCUtils.h @@ -11,5 +11,30 @@ * * --------------------------------------------------------------------------*/ -bdescr *gc_alloc_block(step *stp); -bdescr *gc_alloc_scavd_block(step *stp); +#include "SMP.h" + +#ifdef THREADED_RTS +extern SpinLock gc_alloc_block_sync; +#endif + +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); + +// 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. +INLINE_HEADER rtsBool +isPartiallyFull(bdescr *bd) +{ + return (bd->free + WORK_UNIT_WORDS < bd->start + BLOCK_SIZE_W); +} + + +#if DEBUG +void printMutableList (generation *gen); +#endif