1 /* ----------------------------------------------------------------------------
3 * (c) The GHC Team 1998-2008
5 * Generational garbage collector: utilities
7 * Documentation on the architecture of the Garbage Collector can be
8 * found in the online commentary:
10 * http://hackage.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage/GC
12 * --------------------------------------------------------------------------*/
17 #include "BeginPrivate.h"
19 bdescr *allocBlock_sync(void);
20 void freeChain_sync(bdescr *bd);
22 void push_scanned_block (bdescr *bd, gen_workspace *ws);
23 StgPtr todo_block_full (nat size, gen_workspace *ws);
24 StgPtr alloc_todo_block (gen_workspace *ws, nat size);
26 bdescr *grab_local_todo_block (gen_workspace *ws);
27 #if defined(THREADED_RTS)
28 bdescr *steal_todo_block (nat s);
31 // Returns true if a block is partially full. This predicate is used to try
32 // to re-use partial blocks wherever possible, and to reduce wastage.
33 // We might need to tweak the actual value.
35 isPartiallyFull(bdescr *bd)
37 return (bd->free + WORK_UNIT_WORDS < bd->start + BLOCK_SIZE_W);
42 void printMutableList (generation *gen);
45 // Version of recordMutableGen for use during GC. This uses the
46 // mutable lists attached to the current gc_thread structure, which
47 // are the same as the mutable lists on the Capability.
49 recordMutableGen_GC (StgClosure *p, nat gen_no)
53 bd = gct->mut_lists[gen_no];
54 if (bd->free >= bd->start + BLOCK_SIZE_W) {
56 new_bd = allocBlock_sync();
59 gct->mut_lists[gen_no] = bd;
61 *bd->free++ = (StgWord)p;
64 #include "EndPrivate.h"
66 #endif /* SM_GCUTILS_H */