summaryrefslogtreecommitdiff
path: root/src/vm/comwaithandle.cpp
diff options
context:
space:
mode:
authorJan Vorlicek <janvorli@microsoft.com>2015-09-04 10:16:37 +0200
committerJan Vorlicek <janvorli@microsoft.com>2015-09-04 20:23:55 +0200
commit0aaf0a793e95fbef99c2c7e7e68fb3e1e91adcff (patch)
tree6138221c8d38af6ee7221fa984499b33bc23036b /src/vm/comwaithandle.cpp
parent1165038551b7ca20f230d867dc5fd2357ede14fe (diff)
downloadcoreclr-0aaf0a793e95fbef99c2c7e7e68fb3e1e91adcff.tar.gz
coreclr-0aaf0a793e95fbef99c2c7e7e68fb3e1e91adcff.tar.bz2
coreclr-0aaf0a793e95fbef99c2c7e7e68fb3e1e91adcff.zip
Remove thread affinity and critical region stuff for Unix
The WaitHandleNative::CorWaitMultipleNative was calling Thread::BeginThreadAffinityAndCriticalRegion that results in incrementing the Thread::m_dwCriticalRegionCount. However, there is nothing that would decrement it on CoreCLR, so if the WaitHandleNative::CorWaitMultipleNative is called, in debug build we get an assert in Thread::InternalReset. It turns out that the critical region and thread affinity stuff is not to be used in CoreCLR, so I have disabled handling of that in CoreCLR for Unix. The only remainder are the static methods Thread::BeginThreadAffinity and Thread::EndThreadAffinity which are used in the ThreadAffinityHolder. Conditionally removing the holder usage would be messy, so I have rather kept those methods and made their bodies empty.
Diffstat (limited to 'src/vm/comwaithandle.cpp')
-rw-r--r--src/vm/comwaithandle.cpp11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/vm/comwaithandle.cpp b/src/vm/comwaithandle.cpp
index 3c56cb9c36..0c96e9abf2 100644
--- a/src/vm/comwaithandle.cpp
+++ b/src/vm/comwaithandle.cpp
@@ -275,9 +275,11 @@ FCIMPL4(INT32, WaitHandleNative::CorWaitMultipleNative, Object* waitObjectsUNSAF
pWaitObjects = (PTRARRAYREF)waitObjects; // array of objects on which to wait
HANDLE* internalHandles = (HANDLE*) _alloca(numWaiters*sizeof(HANDLE));
+#ifndef FEATURE_CORECLR
BOOL *hasThreadAffinity = (BOOL*) _alloca(numWaiters*sizeof(BOOL));
BOOL mayRequireThreadAffinity = FALSE;
+#endif // !FEATURE_CORECLR
for (int i=0;i<numWaiters;i++)
{
WAITHANDLEREF waitObject = (WAITHANDLEREF) pWaitObjects->m_Array[i];
@@ -288,15 +290,19 @@ FCIMPL4(INT32, WaitHandleNative::CorWaitMultipleNative, Object* waitObjectsUNSAF
// this behavior seems wrong but someone explicitly coded that condition so it must have been for a reason.
internalHandles[i] = waitObject->m_handle;
+#ifndef FEATURE_CORECLR
// m_hasThreadAffinity is set for Mutex only
hasThreadAffinity[i] = waitObject->m_hasThreadAffinity;
if (hasThreadAffinity[i]) {
mayRequireThreadAffinity = TRUE;
}
+#endif // !FEATURE_CORECLR
}
DWORD res = (DWORD) -1;
+#ifndef FEATURE_CORECLR
ThreadAffinityHolder affinityHolder(mayRequireThreadAffinity);
+#endif // !FEATURE_CORECLR
Context* targetContext;
targetContext = pThread->GetContext();
_ASSERTE(targetContext);
@@ -330,6 +336,7 @@ FCIMPL4(INT32, WaitHandleNative::CorWaitMultipleNative, Object* waitObjectsUNSAF
}
}
+#ifndef FEATURE_CORECLR
if (mayRequireThreadAffinity) {
if (waitForAll) {
if (res >= (DWORD) WAIT_OBJECT_0 && res < (DWORD) WAIT_OBJECT_0 + numWaiters) {
@@ -367,6 +374,8 @@ FCIMPL4(INT32, WaitHandleNative::CorWaitMultipleNative, Object* waitObjectsUNSAF
}
}
}
+#endif // !FEATURE_CORECLR
+
retVal = res;
HELPER_METHOD_FRAME_END();
@@ -449,5 +458,3 @@ FCIMPL5(INT32, WaitHandleNative::CorSignalAndWaitOneNative, SafeHandle* safeWait
}
FCIMPLEND
#endif // !FEATURE_CORECLR
-
-