summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@well-typed.com>2019-02-05 10:59:32 -0500
committerBen Gamari <ben@smart-cactus.org>2019-07-10 01:41:35 -0400
commitc78a91fd220247fdeb3f0b98c0057e271f465959 (patch)
tree39b685b13aa024ab100111ed0a4fae9b0f522035
parent377bd7d280481ed6d0a0ae7f180416ad9819ed86 (diff)
downloadhaskell-wip/gc/ghc-8.7-rebase.tar.gz
rts: Factor out large bitmap walkingwip/gc/ghc-8.7-rebase
This will be needed by the mark phase of the non-moving collector so let's factor it out.
-rw-r--r--rts/sm/HeapUtils.h33
-rw-r--r--rts/sm/Scav.c23
2 files changed, 40 insertions, 16 deletions
diff --git a/rts/sm/HeapUtils.h b/rts/sm/HeapUtils.h
new file mode 100644
index 0000000000..2e9ca34f73
--- /dev/null
+++ b/rts/sm/HeapUtils.h
@@ -0,0 +1,33 @@
+/* -----------------------------------------------------------------------------
+ *
+ * (c) The GHC Team 1998-2008
+ *
+ * General utilities for walking the heap
+ *
+ * ---------------------------------------------------------------------------*/
+
+#pragma once
+
+typedef void (walk_closures_cb)(StgClosure **, void *);
+
+INLINE_HEADER void
+walk_large_bitmap(walk_closures_cb *cb,
+ StgClosure **p,
+ StgLargeBitmap *large_bitmap,
+ StgWord size,
+ void *user)
+{
+ uint32_t b = 0;
+
+ for (uint32_t i = 0; i < size; b++) {
+ StgWord bitmap = large_bitmap->bitmap[b];
+ uint32_t j = stg_min(size-i, BITS_IN(W_));
+ i += j;
+ for (; j > 0; j--, p++) {
+ if ((bitmap & 1) == 0) {
+ cb(p, user);
+ }
+ bitmap = bitmap >> 1;
+ }
+ }
+}
diff --git a/rts/sm/Scav.c b/rts/sm/Scav.c
index 3c3c04a0e1..188623bdf9 100644
--- a/rts/sm/Scav.c
+++ b/rts/sm/Scav.c
@@ -58,6 +58,7 @@
#include "Sanity.h"
#include "Capability.h"
#include "LdvProfile.h"
+#include "HeapUtils.h"
#include "Hash.h"
#include "sm/MarkWeak.h"
@@ -86,6 +87,11 @@ static void scavenge_large_bitmap (StgPtr p,
# define scavenge_compact(str) scavenge_compact1(str)
#endif
+static void do_evacuate(StgClosure **p, void *user STG_UNUSED)
+{
+ evacuate(p);
+}
+
/* -----------------------------------------------------------------------------
Scavenge a TSO.
-------------------------------------------------------------------------- */
@@ -1799,22 +1805,7 @@ scavenge_static(void)
static void
scavenge_large_bitmap( StgPtr p, StgLargeBitmap *large_bitmap, StgWord size )
{
- uint32_t i, j, b;
- StgWord bitmap;
-
- b = 0;
-
- for (i = 0; i < size; b++) {
- bitmap = large_bitmap->bitmap[b];
- j = stg_min(size-i, BITS_IN(W_));
- i += j;
- for (; j > 0; j--, p++) {
- if ((bitmap & 1) == 0) {
- evacuate((StgClosure **)p);
- }
- bitmap = bitmap >> 1;
- }
- }
+ walk_large_bitmap(do_evacuate, (StgClosure **) p, large_bitmap, size, NULL);
}