summaryrefslogtreecommitdiff
path: root/rts/sm/Scav.c
diff options
context:
space:
mode:
Diffstat (limited to 'rts/sm/Scav.c')
-rw-r--r--rts/sm/Scav.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/rts/sm/Scav.c b/rts/sm/Scav.c
index b969de3a74..5d156ed64c 100644
--- a/rts/sm/Scav.c
+++ b/rts/sm/Scav.c
@@ -1251,17 +1251,22 @@ scavenge_stack(StgPtr p, StgPtr stack_end)
// discarding it.
{
nat type;
- type = get_itbl(((StgUpdateFrame *)p)->updatee)->type;
- if (type == IND) {
- ((StgUpdateFrame *)p)->updatee->header.info =
- (StgInfoTable *)&stg_IND_PERM_info;
- } else if (type == IND_OLDGEN) {
- ((StgUpdateFrame *)p)->updatee->header.info =
- (StgInfoTable *)&stg_IND_OLDGEN_PERM_info;
- }
- evacuate(&((StgUpdateFrame *)p)->updatee);
- p += sizeofW(StgUpdateFrame);
- continue;
+ const StgInfoTable *i;
+
+ i = ((StgUpdateFrame *)p)->updatee->header.info;
+ if (!IS_FORWARDING_PTR(i)) {
+ type = get_itbl(((StgUpdateFrame *)p)->updatee)->type;
+ if (type == IND) {
+ ((StgUpdateFrame *)p)->updatee->header.info =
+ (StgInfoTable *)&stg_IND_PERM_info;
+ } else if (type == IND_OLDGEN) {
+ ((StgUpdateFrame *)p)->updatee->header.info =
+ (StgInfoTable *)&stg_IND_OLDGEN_PERM_info;
+ }
+ evacuate(&((StgUpdateFrame *)p)->updatee);
+ p += sizeofW(StgUpdateFrame);
+ continue;
+ }
}
// small bitmap (< 32 entries, or 64 on a 64-bit machine)
@@ -1401,11 +1406,14 @@ scavenge_large (step_workspace *ws)
Scavenge a block
------------------------------------------------------------------------- */
-#define PARALLEL_GC
-#include "Scav.c-inc"
#undef PARALLEL_GC
#include "Scav.c-inc"
+#ifdef THREADED_RTS
+#define PARALLEL_GC
+#include "Scav.c-inc"
+#endif
+
/* ----------------------------------------------------------------------------
Look for work to do.