maybePerformBlockedException (cap, tso);
if (tso->what_next == ThreadKilled) { return; }
+ // NB. Blackholing is *not* optional, we must either do lazy
+ // blackholing, or eager blackholing consistently. See Note
+ // [upd-black-hole] in sm/Scav.c.
+
stack_end = &tso->stack[tso->stack_size];
frame = (StgClosure *)tso->sp;
(long)((StgPtr)frame - tso->sp));
// If this closure is already an indirection, then
- // suspend the computation up to this point:
- suspendComputation(cap,tso,(StgPtr)frame);
+ // suspend the computation up to this point.
+ // NB. check raiseAsync() to see what happens when
+ // we're in a loop (#2783).
+ suspendComputation(cap,tso,(StgUpdateFrame*)frame);
// Now drop the update frame, and arrange to return
// the value to the frame underneath:
// And continue with threadPaused; there might be
// yet more computation to suspend.
- threadPaused(cap,tso);
- return;
+ frame = (StgClosure *)tso->sp + 2;
+ prev_was_update_frame = rtsFalse;
+ continue;
}
if (bh->header.info != &stg_CAF_BLACKHOLE_info) {
-#if (!defined(LAZY_BLACKHOLING)) && defined(DEBUG)
- debugBelch("Unexpected lazy BHing required at 0x%04lx\n",(long)bh);
-#endif
// zero out the slop so that the sanity checker can tell
// where the next closure is.
DEBUG_FILL_SLOP(bh);
// We pretend that bh is now dead.
LDV_recordDead_FILL_SLOP_DYNAMIC((StgClosure *)bh);
#endif
-
+ // an EAGER_BLACKHOLE gets turned into a BLACKHOLE here.
#ifdef THREADED_RTS
cur_bh_info = (const StgInfoTable *)
cas((StgVolatilePtr)&bh->header.info,
// the number of words we have to shift down is less than the
// number of stack words we squeeze away by doing so.
if (RtsFlags.GcFlags.squeezeUpdFrames == rtsTrue &&
- ((weight <= 4 && words_to_squeeze > 0) || weight < words_to_squeeze)) {
+ ((weight <= 5 && words_to_squeeze > 0) || weight < words_to_squeeze)) {
stackSqueeze(tso, (StgPtr)frame);
}
}