summaryrefslogtreecommitdiff
path: root/rts/GCCompact.h
diff options
context:
space:
mode:
Diffstat (limited to 'rts/GCCompact.h')
-rw-r--r--rts/GCCompact.h44
1 files changed, 44 insertions, 0 deletions
diff --git a/rts/GCCompact.h b/rts/GCCompact.h
new file mode 100644
index 0000000000..0fb39b3b12
--- /dev/null
+++ b/rts/GCCompact.h
@@ -0,0 +1,44 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team 1998-2005
+ *
+ * Compacting garbage collector
+ *
+ * ---------------------------------------------------------------------------*/
+
+#ifndef GCCOMPACT_H
+#define GCCOMPACT_H
+
+STATIC_INLINE void
+mark(StgPtr p, bdescr *bd)
+{
+ nat offset_within_block = p - bd->start; // in words
+ StgPtr bitmap_word = (StgPtr)bd->u.bitmap +
+ (offset_within_block / (sizeof(W_)*BITS_PER_BYTE));
+ StgWord bit_mask = (StgWord)1 << (offset_within_block & (sizeof(W_)*BITS_PER_BYTE - 1));
+ *bitmap_word |= bit_mask;
+}
+
+STATIC_INLINE void
+unmark(StgPtr p, bdescr *bd)
+{
+ nat offset_within_block = p - bd->start; // in words
+ StgPtr bitmap_word = (StgPtr)bd->u.bitmap +
+ (offset_within_block / (sizeof(W_)*BITS_PER_BYTE));
+ StgWord bit_mask = (StgWord)1 << (offset_within_block & (sizeof(W_)*BITS_PER_BYTE - 1));
+ *bitmap_word &= ~bit_mask;
+}
+
+STATIC_INLINE StgWord
+is_marked(StgPtr p, bdescr *bd)
+{
+ nat offset_within_block = p - bd->start; // in words
+ StgPtr bitmap_word = (StgPtr)bd->u.bitmap +
+ (offset_within_block / (sizeof(W_)*BITS_PER_BYTE));
+ StgWord bit_mask = (StgWord)1 << (offset_within_block & (sizeof(W_)*BITS_PER_BYTE - 1));
+ return (*bitmap_word & bit_mask);
+}
+
+void compact( void (*get_roots)(evac_fn) );
+
+#endif /* GCCOMPACT_H */