stg_block_throwto_finally
{
-#ifdef THREADED_RTS
- foreign "C" throwToReleaseTarget (R3 "ptr");
-#endif
+ // unlock the throwto message, but only if it wasn't already
+ // unlocked. It may have been unlocked if we revoked the message
+ // due to an exception being raised during threadPaused().
+ if (StgHeader_info(StgTSO_block_info(CurrentTSO)) == stg_WHITEHOLE_info) {
+ unlockClosure(StgTSO_block_info(CurrentTSO), stg_MSG_THROWTO_info);
+ }
jump StgReturn;
}