Enable thread interrupt in finally blocks
authorKoundinya Veluri <kouvel@microsoft.com>
Sat, 14 Jan 2017 00:34:36 +0000 (16:34 -0800)
committerKoundinya Veluri <kouvel@microsoft.com>
Sat, 14 Jan 2017 01:21:19 +0000 (17:21 -0800)
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

src/coreclr/src/vm/threads.cpp
src/coreclr/src/vm/threads.h
src/coreclr/src/vm/threadsuspend.cpp

index 38094ca..732cb2d 100644 (file)
@@ -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;
 }
index 9754478..51116e1 100644 (file)
@@ -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();
index 18d04db..0c8314d 100644 (file)
@@ -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;
     }