* thread, which might result in the thread being killed.
*/
-#ifndef REG_R1
- /*
- * raiseAsync assumes that the stack is in ThreadRunGHC state,
- * i.e. with a return address on the top. In unreg mode, the
- * return value for IO is on top of the return address, so we
- * need to make a small adjustment here.
- */
- Sp_adj(1);
-#endif
+ STK_CHK_GEN( WDS(2), R1_PTR, stg_unblockAsyncExceptionszh_ret_info);
+ Sp_adj(-2);
+ Sp(1) = R1;
+ Sp(0) = stg_gc_unpt_r1_info;
SAVE_THREAD_STATE();
(r) = foreign "C" maybePerformBlockedException (MyCapability() "ptr",
CurrentTSO "ptr") [R1];
jump %ENTRY_CODE(Sp(0));
}
}
-#ifndef REG_R1
- /*
- * Readjust stack in unregisterised mode if we didn't raise an
- * exception, see above
- */
- else {
- Sp_adj(-1);
- }
-#endif
}
-#ifdef REG_R1
Sp_adj(1);
jump %ENTRY_CODE(Sp(0));
-#else
- Sp(1) = Sp(0);
- Sp_adj(1);
- jump %ENTRY_CODE(Sp(1));
-#endif
}
INFO_TABLE_RET( stg_blockAsyncExceptionszh_ret, RET_SMALL )
StgTSO_flags(CurrentTSO) =
StgTSO_flags(CurrentTSO) | TSO_BLOCKEX::I32 | TSO_INTERRUPTIBLE::I32;
-#ifdef REG_R1
Sp_adj(1);
jump %ENTRY_CODE(Sp(0));
-#else
- Sp(1) = Sp(0);
- Sp_adj(1);
- jump %ENTRY_CODE(Sp(1));
-#endif
}
blockAsyncExceptionszh_fast
jump stg_ap_v_fast;
}
+asyncExceptionsBlockedzh_fast
+{
+ /* args: none */
+ if ((TO_W_(StgTSO_flags(CurrentTSO)) & TSO_BLOCKEX) != 0) {
+ RET_N(1);
+ } else {
+ RET_N(0);
+ }
+}
killThreadzh_fast
{
*/
loop:
if (StgTSO_what_next(target) == ThreadRelocated::I16) {
- target = StgTSO_link(target);
+ target = StgTSO__link(target);
goto loop;
}
if (target == CurrentTSO) {
Catch frames
-------------------------------------------------------------------------- */
-#ifdef REG_R1
#define SP_OFF 0
-#else
-#define SP_OFF 1
-#endif
/* Catch frames are very similar to update frames, but when entering
* one we just pop the frame off the stack and perform the correct
W_ unused1, W_ unused2,
#endif
W_ unused3, "ptr" W_ unused4)
-#ifdef REG_R1
{
Sp = Sp + SIZEOF_StgCatchFrame;
jump %ENTRY_CODE(Sp(SP_OFF));
}
-#else
- {
- W_ rval;
- rval = Sp(0);
- Sp = Sp + SIZEOF_StgCatchFrame;
- Sp(0) = rval;
- jump %ENTRY_CODE(Sp(SP_OFF));
- }
-#endif
/* -----------------------------------------------------------------------------
* The catch infotable