From: Koundinya Veluri Date: Sat, 14 Jan 2017 00:34:36 +0000 (-0800) Subject: Enable thread interrupt in finally blocks X-Git-Tag: submit/tizen/20210909.063632~11030^2~8443^2~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1bcabac2180478c562c9a16259eeb6b45621ef59;p=platform%2Fupstream%2Fdotnet%2Fruntime.git Enable thread interrupt in finally blocks 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 --- diff --git a/src/coreclr/src/vm/threads.cpp b/src/coreclr/src/vm/threads.cpp index 38094ca..732cb2d 100644 --- a/src/coreclr/src/vm/threads.cpp +++ b/src/coreclr/src/vm/threads.cpp @@ -6807,17 +6807,14 @@ void Thread::HandleThreadInterrupt (BOOL fWaitForADUnload) } 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; } diff --git a/src/coreclr/src/vm/threads.h b/src/coreclr/src/vm/threads.h index 9754478..51116e1 100644 --- a/src/coreclr/src/vm/threads.h +++ b/src/coreclr/src/vm/threads.h @@ -3166,12 +3166,7 @@ public: }; private: - BOOL ReadyForInterrupt() - { - return ReadyForAsyncException(TI_Interrupt); - } - - BOOL ReadyForAsyncException(ThreadInterruptMode mode); + BOOL ReadyForAsyncException(); public: inline BOOL IsYieldRequested() @@ -3185,7 +3180,7 @@ public: void SetAbortRequest(EEPolicy::ThreadAbortTypes abortType); // Should only be called by ADUnload BOOL ReadyForAbort() { - return ReadyForAsyncException(TI_Abort); + return ReadyForAsyncException(); } BOOL IsRudeAbort(); diff --git a/src/coreclr/src/vm/threadsuspend.cpp b/src/coreclr/src/vm/threadsuspend.cpp index 18d04db..0c8314d 100644 --- a/src/coreclr/src/vm/threadsuspend.cpp +++ b/src/coreclr/src/vm/threadsuspend.cpp @@ -1345,7 +1345,7 @@ BOOL Thread::IsSafeToInjectThreadAbort(PTR_CONTEXT pContextToCheck) #endif -BOOL Thread::ReadyForAsyncException(ThreadInterruptMode mode) +BOOL Thread::ReadyForAsyncException() { CONTRACTL { NOTHROW; @@ -1354,8 +1354,7 @@ BOOL Thread::ReadyForAsyncException(ThreadInterruptMode mode) } CONTRACTL_END; - if (((mode & TI_Abort) != 0 && !IsAbortRequested()) || - ((mode & TI_Interrupt) != 0 && (m_UserInterrupt & TI_Interrupt) == 0)) + if (!IsAbortRequested()) { return FALSE; }