X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FGC.c;h=4235d3e826bc00f647a9f9df568c360d17b123c3;hb=4dfe2a24d9717a809cebc14592212bf3bdf46342;hp=8a3b54ebb25fb470db924d7059fa6c91eee17ff5;hpb=beb5737b7ee42c4e9373a505e7d957206d69a30e;p=ghc-hetmet.git diff --git a/ghc/rts/GC.c b/ghc/rts/GC.c index 8a3b54e..4235d3e 100644 --- a/ghc/rts/GC.c +++ b/ghc/rts/GC.c @@ -1154,7 +1154,9 @@ GarbageCollect ( void (*get_roots)(evac_fn), rtsBool force_major_gc ) ACQUIRE_SM_LOCK; // send exceptions to any threads which were about to die + RELEASE_SM_LOCK; resurrectThreads(resurrected_threads); + ACQUIRE_SM_LOCK; // Update the stable pointer hash table. updateStablePtrTable(major_gc); @@ -2016,11 +2018,15 @@ loop: case THUNK_SELECTOR: { StgClosure *p; + const StgInfoTable *info_ptr; if (thunk_selector_depth > MAX_THUNK_SELECTOR_DEPTH) { return copy(q,THUNK_SELECTOR_sizeW(),stp); } + // stashed away for LDV profiling, see below + info_ptr = q->header.info; + p = eval_thunk_selector(info->layout.selector_offset, (StgSelector *)q); @@ -2033,6 +2039,13 @@ loop: val = evacuate(p); thunk_selector_depth--; +#ifdef PROFILING + // For the purposes of LDV profiling, we have destroyed + // the original selector thunk. + SET_INFO(q, info_ptr); + LDV_RECORD_DEAD_FILL_SLOP_DYNAMIC(q); +#endif + // Update the THUNK_SELECTOR with an indirection to the // EVACUATED closure now at p. Why do this rather than // upd_evacuee(q,p)? Because we have an invariant that an @@ -2042,12 +2055,10 @@ loop: SET_INFO(q, &stg_IND_info); ((StgInd *)q)->indirectee = p; -#ifdef PROFILING - // We store the size of the just evacuated object in the - // LDV word so that the profiler can guess the position of - // the next object later. - SET_EVACUAEE_FOR_LDV(q, THUNK_SELECTOR_sizeW()); -#endif + // For the purposes of LDV profiling, we have created an + // indirection. + LDV_RECORD_CREATE(q); + return val; } } @@ -4679,8 +4690,8 @@ end: // Should we squeeze or not? Arbitrary heuristic: we squeeze if // the number of words we have to shift down is less than the // number of stack words we squeeze away by doing so. - if (1 /*RtsFlags.GcFlags.squeezeUpdFrames == rtsTrue && - weight < words_to_squeeze*/) { + if (RtsFlags.GcFlags.squeezeUpdFrames == rtsTrue && + weight < words_to_squeeze) { stackSqueeze(tso, (StgPtr)frame); } }