summaryrefslogtreecommitdiff
path: root/rts/sm
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2011-02-02 17:00:36 +0000
committerSimon Marlow <marlowsd@gmail.com>2011-02-02 17:00:36 +0000
commit367d9a0f37b3be938d14c650434beee3c79814fe (patch)
tree524410aa1db70b4da183aafdbda81eef8a6c2ce7 /rts/sm
parentdf521c32ec213d427389228bfbde928ace6a20c5 (diff)
downloadhaskell-367d9a0f37b3be938d14c650434beee3c79814fe.tar.gz
fix compacting GC
Diffstat (limited to 'rts/sm')
-rw-r--r--rts/sm/Compact.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/rts/sm/Compact.c b/rts/sm/Compact.c
index eceaba4010..ff7480cd57 100644
--- a/rts/sm/Compact.c
+++ b/rts/sm/Compact.c
@@ -14,6 +14,7 @@
#include "PosixSource.h"
#include "Rts.h"
+#include "GCThread.h"
#include "Storage.h"
#include "RtsUtils.h"
#include "BlockAlloc.h"
@@ -935,7 +936,7 @@ update_bkwd_compact( generation *gen )
void
compact(StgClosure *static_objects)
{
- nat g, blocks;
+ nat n, g, blocks;
generation *gen;
// 1. thread the roots
@@ -953,7 +954,6 @@ compact(StgClosure *static_objects)
for (g = 1; g < RtsFlags.GcFlags.generations; g++) {
bdescr *bd;
StgPtr p;
- nat n;
for (n = 0; n < n_capabilities; n++) {
for (bd = capabilities[n].mut_lists[g];
bd != NULL; bd = bd->link) {
@@ -1001,6 +1001,10 @@ compact(StgClosure *static_objects)
debugTrace(DEBUG_gc, "update_fwd: %d", g);
update_fwd(gen->blocks);
+ for (n = 0; n < n_capabilities; n++) {
+ update_fwd(gc_threads[n]->gens[g].todo_bd);
+ update_fwd(gc_threads[n]->gens[g].part_list);
+ }
update_fwd_large(gen->scavenged_large_objects);
if (g == RtsFlags.GcFlags.generations-1 && gen->old_blocks != NULL) {
debugTrace(DEBUG_gc, "update_fwd: %d (compact)", g);