Thread abort was not allowed in finally blocks, but the same logic was being applied to thread interrupt as well. There is nothing special about thread interrupt that requires it to not work in finally blocks.
Commit migrated from https://github.com/dotnet/coreclr/commit/
626a286433b6e3ed040744746c9b851361ea9546
}
if ((m_UserInterrupt & TI_Interrupt) != 0)
{
- if (ReadyForInterrupt())
- {
- ResetThreadState ((ThreadState)(TS_Interrupted | TS_Interruptible));
- FastInterlockAnd ((DWORD*)&m_UserInterrupt, ~TI_Interrupt);
+ ResetThreadState ((ThreadState)(TS_Interrupted | TS_Interruptible));
+ FastInterlockAnd ((DWORD*)&m_UserInterrupt, ~TI_Interrupt);
#ifdef _DEBUG
- AddFiberInfo(ThreadTrackInfo_Abort);
+ AddFiberInfo(ThreadTrackInfo_Abort);
#endif
- COMPlusThrow(kThreadInterruptedException);
- }
+ COMPlusThrow(kThreadInterruptedException);
}
END_SO_INTOLERANT_CODE;
}
};
private:
- BOOL ReadyForInterrupt()
- {
- return ReadyForAsyncException(TI_Interrupt);
- }
-
- BOOL ReadyForAsyncException(ThreadInterruptMode mode);
+ BOOL ReadyForAsyncException();
public:
inline BOOL IsYieldRequested()
void SetAbortRequest(EEPolicy::ThreadAbortTypes abortType); // Should only be called by ADUnload
BOOL ReadyForAbort()
{
- return ReadyForAsyncException(TI_Abort);
+ return ReadyForAsyncException();
}
BOOL IsRudeAbort();
#endif
-BOOL Thread::ReadyForAsyncException(ThreadInterruptMode mode)
+BOOL Thread::ReadyForAsyncException()
{
CONTRACTL {
NOTHROW;
}
CONTRACTL_END;
- if (((mode & TI_Abort) != 0 && !IsAbortRequested()) ||
- ((mode & TI_Interrupt) != 0 && (m_UserInterrupt & TI_Interrupt) == 0))
+ if (!IsAbortRequested())
{
return FALSE;
}