1 /* -----------------------------------------------------------------------------
3 * (c) The GHC Team 1998-2008
5 * Compacting garbage collector
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 * ---------------------------------------------------------------------------*/
20 mark_stack_empty(void)
22 return mark_sp == mark_stack;
28 return mark_sp >= mark_splim;
32 reset_mark_stack(void)
38 push_mark_stack(StgPtr p)
50 mark(StgPtr p, bdescr *bd)
52 nat offset_within_block = p - bd->start; // in words
53 StgPtr bitmap_word = (StgPtr)bd->u.bitmap +
54 (offset_within_block / (sizeof(W_)*BITS_PER_BYTE));
55 StgWord bit_mask = (StgWord)1 << (offset_within_block & (sizeof(W_)*BITS_PER_BYTE - 1));
56 *bitmap_word |= bit_mask;
60 unmark(StgPtr p, bdescr *bd)
62 nat offset_within_block = p - bd->start; // in words
63 StgPtr bitmap_word = (StgPtr)bd->u.bitmap +
64 (offset_within_block / (sizeof(W_)*BITS_PER_BYTE));
65 StgWord bit_mask = (StgWord)1 << (offset_within_block & (sizeof(W_)*BITS_PER_BYTE - 1));
66 *bitmap_word &= ~bit_mask;
70 is_marked(StgPtr p, bdescr *bd)
72 nat offset_within_block = p - bd->start; // in words
73 StgPtr bitmap_word = (StgPtr)bd->u.bitmap +
74 (offset_within_block / (sizeof(W_)*BITS_PER_BYTE));
75 StgWord bit_mask = (StgWord)1 << (offset_within_block & (sizeof(W_)*BITS_PER_BYTE - 1));
76 return (*bitmap_word & bit_mask);
79 void compact (StgClosure *static_objects);
83 #endif /* SM_COMPACT_H */