X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FGC.c;h=6f15a47a90eddd91d208ab1f1464f7d2a710ee75;hb=53628e913632cac29d54da914040e39add334784;hp=02fd6d91610b363f3c09018c13b2ef0972b7c73f;hpb=a2a67cd520b9841114d69a87a423dabcb3b4368e;p=ghc-hetmet.git diff --git a/rts/sm/GC.c b/rts/sm/GC.c index 02fd6d9..6f15a47 100644 --- a/rts/sm/GC.c +++ b/rts/sm/GC.c @@ -33,6 +33,7 @@ #endif #include "Trace.h" #include "RetainerProfile.h" +#include "LdvProfile.h" #include "RaiseAsync.h" #include "Papi.h" #include "Stable.h" @@ -236,7 +237,8 @@ GarbageCollect (rtsBool force_major_gc, n = initialise_N(force_major_gc); #if defined(THREADED_RTS) - work_stealing = RtsFlags.ParFlags.parGcLoadBalancing; + work_stealing = RtsFlags.ParFlags.parGcLoadBalancingEnabled && + N >= RtsFlags.ParFlags.parGcLoadBalancingGen; // It's not always a good idea to do load balancing in parallel // GC. In particular, for a parallel program we don't want to // lose locality by moving cached data into another CPU's cache @@ -1065,6 +1067,11 @@ loop: void gcWorkerThread (Capability *cap) { + gc_thread *saved_gct; + + // necessary if we stole a callee-saves register for gct: + saved_gct = gct; + cap->in_gc = rtsTrue; gct = gc_threads[cap->no]; @@ -1104,6 +1111,8 @@ gcWorkerThread (Capability *cap) gct->thread_index); ACQUIRE_SPIN_LOCK(&gct->mut_spin); debugTrace(DEBUG_gc, "GC thread %d on my way...", gct->thread_index); + + SET_GCT(saved_gct); } #endif