diff options
author | Jan Vorlicek <janvorli@microsoft.com> | 2015-09-04 10:16:37 +0200 |
---|---|---|
committer | Jan Vorlicek <janvorli@microsoft.com> | 2015-09-04 20:23:55 +0200 |
commit | 0aaf0a793e95fbef99c2c7e7e68fb3e1e91adcff (patch) | |
tree | 6138221c8d38af6ee7221fa984499b33bc23036b /src/vm/comwaithandle.cpp | |
parent | 1165038551b7ca20f230d867dc5fd2357ede14fe (diff) | |
download | coreclr-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.cpp | 11 |
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 - - |