info = get_itbl((StgClosure *)p);
q = p;
- switch (info->type) {
+ switch (((volatile StgWord *)info)[1] & 0xffff) {
case MVAR_CLEAN:
case MVAR_DIRTY:
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;
}
}
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)
// 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;
}