X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FScav.c;h=d5e9b12292f4467f5d7f5f4a7f5c2580f53328ec;hb=de75026f5a48d3d052135a973ab4dff76c5b20f5;hp=9d1a0b6bf4cd185713b1f6f78419625bdfafed4a;hpb=6a405b1efd138a4af4ed93ce4ff173a4c5704512;p=ghc-hetmet.git diff --git a/rts/sm/Scav.c b/rts/sm/Scav.c index 9d1a0b6..d5e9b12 100644 --- a/rts/sm/Scav.c +++ b/rts/sm/Scav.c @@ -69,7 +69,7 @@ scavengeTSO (StgTSO *tso) return; } - debugTrace(DEBUG_gc,"scavenging thread %d",tso->id); + debugTrace(DEBUG_gc,"scavenging thread %d",(int)tso->id); saved_eager = gct->eager_promotion; gct->eager_promotion = rtsFalse; @@ -335,6 +335,7 @@ scavenge_block (bdescr *bd) // time around the loop. while (p < bd->free || (bd == ws->todo_bd && p < ws->todo_free)) { + ASSERT(bd->link == NULL); ASSERT(LOOKS_LIKE_CLOSURE_PTR(p)); info = get_itbl((StgClosure *)p); @@ -1372,7 +1373,7 @@ scavenge_one(StgPtr p) * evacuated, so we perform that check here. */ StgClosure *q = ((StgInd *)p)->indirectee; - if (HEAP_ALLOCED(q) && Bdescr((StgPtr)q)->flags & BF_EVACUATED) { + if (HEAP_ALLOCED_GC(q) && Bdescr((StgPtr)q)->flags & BF_EVACUATED) { break; } evacuate(&((StgInd *)p)->indirectee); @@ -1915,7 +1916,7 @@ loop: break; } - if ((bd = grab_todo_block(ws)) != NULL) { + if ((bd = grab_local_todo_block(ws)) != NULL) { scavenge_block(bd); did_something = rtsTrue; break; @@ -1926,6 +1927,28 @@ loop: did_anything = rtsTrue; goto loop; } + +#if defined(THREADED_RTS) + if (work_stealing) { + // look for work to steal + for (s = total_steps-1; s >= 0; s--) { + if (s == 0 && RtsFlags.GcFlags.generations > 1) { + continue; + } + if ((bd = steal_todo_block(s)) != NULL) { + scavenge_block(bd); + did_something = rtsTrue; + break; + } + } + + if (did_something) { + did_anything = rtsTrue; + goto loop; + } + } +#endif + // only return when there is no more work to do return did_anything;