summaryrefslogtreecommitdiff
path: root/src/vm/comwaithandle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/comwaithandle.cpp')
-rw-r--r--src/vm/comwaithandle.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/vm/comwaithandle.cpp b/src/vm/comwaithandle.cpp
index 935a8f031a..48dab31fcd 100644
--- a/src/vm/comwaithandle.cpp
+++ b/src/vm/comwaithandle.cpp
@@ -311,3 +311,29 @@ FCIMPL5(INT32, WaitHandleNative::CorSignalAndWaitOneNative, SafeHandle* safeWait
return retVal;
}
FCIMPLEND
+
+FCIMPL3(DWORD, WaitHandleNative::WaitHelper, PTRArray *handleArrayUNSAFE, CLR_BOOL waitAll, DWORD millis)
+{
+ FCALL_CONTRACT;
+
+ DWORD ret = 0;
+
+ PTRARRAYREF handleArrayObj = (PTRARRAYREF) handleArrayUNSAFE;
+ HELPER_METHOD_FRAME_BEGIN_RET_1(handleArrayObj);
+
+ CQuickArray<HANDLE> qbHandles;
+ int cHandles = handleArrayObj->GetNumComponents();
+
+ // Since DoAppropriateWait could cause a GC, we need to copy the handles to an unmanaged block
+ // of memory to ensure they aren't relocated during the call to DoAppropriateWait.
+ qbHandles.AllocThrows(cHandles);
+ memcpy(qbHandles.Ptr(), handleArrayObj->GetDataPtr(), cHandles * sizeof(HANDLE));
+
+ Thread * pThread = GetThread();
+ ret = pThread->DoAppropriateWait(cHandles, qbHandles.Ptr(), waitAll, millis,
+ (WaitMode)(WaitMode_Alertable | WaitMode_IgnoreSyncCtx));
+
+ HELPER_METHOD_FRAME_END();
+ return ret;
+}
+FCIMPLEND