fix a printf format warning
[ghc-hetmet.git] / rts / sm / Compact.h
1 /* -----------------------------------------------------------------------------
2  *
3  * (c) The GHC Team 1998-2005
4  *
5  * Compacting garbage collector
6  *
7  * ---------------------------------------------------------------------------*/
8
9 #ifndef GCCOMPACT_H
10 #define GCCOMPACT_H
11
12 INLINE_HEADER rtsBool
13 mark_stack_empty(void)
14 {
15     return mark_sp == mark_stack;
16 }
17
18 INLINE_HEADER rtsBool
19 mark_stack_full(void)
20 {
21     return mark_sp >= mark_splim;
22 }
23
24 INLINE_HEADER void
25 reset_mark_stack(void)
26 {
27     mark_sp = mark_stack;
28 }
29
30 INLINE_HEADER void
31 push_mark_stack(StgPtr p)
32 {
33     *mark_sp++ = p;
34 }
35
36 INLINE_HEADER StgPtr
37 pop_mark_stack(void)
38 {
39     return *--mark_sp;
40 }
41
42 INLINE_HEADER void 
43 mark(StgPtr p, bdescr *bd)
44 {
45     nat offset_within_block = p - bd->start; // in words
46     StgPtr bitmap_word = (StgPtr)bd->u.bitmap + 
47         (offset_within_block / (sizeof(W_)*BITS_PER_BYTE));
48     StgWord bit_mask = (StgWord)1 << (offset_within_block & (sizeof(W_)*BITS_PER_BYTE - 1));
49     *bitmap_word |= bit_mask;
50 }
51
52 INLINE_HEADER void 
53 unmark(StgPtr p, bdescr *bd)
54 {
55     nat offset_within_block = p - bd->start; // in words
56     StgPtr bitmap_word = (StgPtr)bd->u.bitmap + 
57         (offset_within_block / (sizeof(W_)*BITS_PER_BYTE));
58     StgWord bit_mask = (StgWord)1 << (offset_within_block & (sizeof(W_)*BITS_PER_BYTE - 1));
59     *bitmap_word &= ~bit_mask;
60 }
61
62 INLINE_HEADER StgWord
63 is_marked(StgPtr p, bdescr *bd)
64 {
65     nat offset_within_block = p - bd->start; // in words
66     StgPtr bitmap_word = (StgPtr)bd->u.bitmap + 
67         (offset_within_block / (sizeof(W_)*BITS_PER_BYTE));
68     StgWord bit_mask = (StgWord)1 << (offset_within_block & (sizeof(W_)*BITS_PER_BYTE - 1));
69     return (*bitmap_word & bit_mask);
70 }
71
72 void compact(void);
73
74 #endif /* GCCOMPACT_H */