X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FScav.c;h=1640eddabf2af776e7af471f4b99c154835c5028;hb=5801be78034f83a82527e5b035a540b4cf9741eb;hp=17e519db2a745e16bdc002d86db77395089b5c79;hpb=d13df738cbbe8017ae19ae2702f4e10805ee521b;p=ghc-hetmet.git diff --git a/rts/sm/Scav.c b/rts/sm/Scav.c index 17e519d..1640edd 100644 --- a/rts/sm/Scav.c +++ b/rts/sm/Scav.c @@ -134,6 +134,10 @@ scavenge_fun_srt(const StgInfoTable *info) static void scavengeTSO (StgTSO *tso) { + rtsBool saved_eager = gct->eager_promotion; + + gct->eager_promotion = rtsFalse; + if ( tso->why_blocked == BlockedOnMVar || tso->why_blocked == BlockedOnBlackHole || tso->why_blocked == BlockedOnException @@ -154,6 +158,14 @@ scavengeTSO (StgTSO *tso) // scavenge this thread's stack scavenge_stack(tso->sp, &(tso->stack[tso->stack_size])); + + if (gct->failed_to_evac) { + tso->flags |= TSO_DIRTY; + } else { + tso->flags &= ~TSO_DIRTY; + } + + gct->eager_promotion = saved_eager; } /* ----------------------------------------------------------------------------- @@ -275,7 +287,7 @@ linear_scan: info = get_itbl((StgClosure *)p); q = p; - switch (info->type) { + switch (((volatile StgWord *)info)[1] & 0xffff) { case MVAR_CLEAN: case MVAR_DIRTY: @@ -494,19 +506,7 @@ linear_scan: case TSO: { - StgTSO *tso = (StgTSO *)p; - rtsBool saved_eager = gct->eager_promotion; - - gct->eager_promotion = rtsFalse; - scavengeTSO(tso); - gct->eager_promotion = saved_eager; - - if (gct->failed_to_evac) { - tso->flags |= TSO_DIRTY; - } else { - tso->flags &= ~TSO_DIRTY; - } - + scavengeTSO((StgTSO*)p); gct->failed_to_evac = rtsTrue; // always on the mutable list break; } @@ -826,19 +826,7 @@ scavenge_one(StgPtr p) case TSO: { - StgTSO *tso = (StgTSO *)p; - rtsBool saved_eager = gct->eager_promotion; - - gct->eager_promotion = rtsFalse; - scavengeTSO(tso); - gct->eager_promotion = saved_eager; - - if (gct->failed_to_evac) { - tso->flags |= TSO_DIRTY; - } else { - tso->flags &= ~TSO_DIRTY; - } - + scavengeTSO((StgTSO*)p); gct->failed_to_evac = rtsTrue; // always on the mutable list break; } @@ -1052,7 +1040,7 @@ scavenge_mutable_list(generation *gen) } // free the old mut_list - freeChain(gen->saved_mut_list); + freeChain_sync(gen->saved_mut_list); gen->saved_mut_list = NULL; } @@ -1409,8 +1397,8 @@ scavenge_find_global_work (void) step_workspace *ws; flag = rtsFalse; - for (g = RtsFlags.GcFlags.generations; --g >= 0; ) { - for (s = generations[g].n_steps; --s >= 0; ) { + for (g = RtsFlags.GcFlags.generations-1; g >= 0; g--) { + for (s = generations[g].n_steps-1; s >= 0; s--) { if (g == 0 && s == 0 && RtsFlags.GcFlags.generations > 1) { continue; } @@ -1469,6 +1457,11 @@ scavenge_find_local_work (void) } ws = &gct->steps[g][s]; + if (ws->todo_bd != NULL) + { + ws->todo_bd->free = ws->todo_free; + } + // If we have a todo block and no scan block, start // scanning the todo block. if (ws->scan_bd == NULL && ws->todo_bd != NULL) @@ -1568,8 +1561,8 @@ any_work (void) // Check for global work in any step. We don't need to check for // local work, because we have already exited scavenge_loop(), // which means there is no local work for this thread. - for (g = RtsFlags.GcFlags.generations; --g >= 0; ) { - for (s = generations[g].n_steps; --s >= 0; ) { + for (g = RtsFlags.GcFlags.generations-1; g >= 0; g--) { + for (s = generations[g].n_steps-1; s >= 0; s--) { if (g == 0 && s == 0 && RtsFlags.GcFlags.generations > 1) { continue; }