summaryrefslogtreecommitdiff
path: root/rts/sm/Evac.c
diff options
context:
space:
mode:
authorSimon Marlow <simonmar@microsoft.com>2006-11-14 12:31:57 +0000
committerSimon Marlow <simonmar@microsoft.com>2006-11-14 12:31:57 +0000
commit9cd54893c0097b5b763dc9657e3c228492cdb87f (patch)
tree4164b0e68c33e849dad2821d1052ae4df23a1f73 /rts/sm/Evac.c
parent32995434659d9c3adb5e33d76a4a6c5daa5fc4a8 (diff)
downloadhaskell-9cd54893c0097b5b763dc9657e3c228492cdb87f.tar.gz
Fix (yet another) odd interaction between selector thunks and compacting GC
This should fix errors of the form internal error: scavenge_mark_stack: unimplemented/strange closure type 28 @ 0x2b92e5f79960 But since it's quite difficult to reproduce the error, I can't be 100% certain it's gone. I certainly can't reproduce it again after the fix, anyway.
Diffstat (limited to 'rts/sm/Evac.c')
-rw-r--r--rts/sm/Evac.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/rts/sm/Evac.c b/rts/sm/Evac.c
index bae6ed7190..6ca7d85fc2 100644
--- a/rts/sm/Evac.c
+++ b/rts/sm/Evac.c
@@ -846,6 +846,14 @@ selector_loop:
if (thunk_selector_depth >= MAX_THUNK_SELECTOR_DEPTH) {
break;
}
+
+ // we don't update THUNK_SELECTORS in the compacted
+ // generation, because compaction does not remove the INDs
+ // that result, this causes confusion later.
+ if (Bdescr((P_)selectee)->flags && BF_COMPACTED) {
+ break;
+ }
+
thunk_selector_depth++;
val = eval_thunk_selector(info->layout.selector_offset,