diff options
author | Simon Marlow <simonmar@microsoft.com> | 2006-11-14 12:31:57 +0000 |
---|---|---|
committer | Simon Marlow <simonmar@microsoft.com> | 2006-11-14 12:31:57 +0000 |
commit | 9cd54893c0097b5b763dc9657e3c228492cdb87f (patch) | |
tree | 4164b0e68c33e849dad2821d1052ae4df23a1f73 /rts/sm/Evac.c | |
parent | 32995434659d9c3adb5e33d76a4a6c5daa5fc4a8 (diff) | |
download | haskell-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.c | 8 |
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, |