/*======================================================================== ** Waits for signal from all the objects. ** timeout indicates how long to wait before the method returns. ** This method will return either when all the object have been pulsed ** or timeout milliseonds have elapsed. ** ========================================================================*/ private static int WaitMultiple( RuntimeThread currentThread, SafeWaitHandle[] safeWaitHandles, int count, int millisecondsTimeout, bool waitAll) { Debug.Assert(currentThread == RuntimeThread.CurrentThread); Debug.Assert(safeWaitHandles != null); Debug.Assert(safeWaitHandles.Length >= count); IntPtr[] rentedHandles = currentThread.RentWaitedHandleArray(count); IntPtr[] handles = rentedHandles ?? new IntPtr[count]; try { for (int i = 0; i < count; i++) { handles[i] = safeWaitHandles[i].DangerousGetHandle(); } return(WaitForMultipleObjects(handles, count, waitAll, millisecondsTimeout)); } finally { if (rentedHandles != null) { currentThread.ReturnWaitedHandleArray(rentedHandles); } } }
/*======================================================================== ** Waits for signal from all the objects. ** timeout indicates how long to wait before the method returns. ** This method will return either when all the object have been pulsed ** or timeout milliseonds have elapsed. ** ========================================================================*/ private static int WaitMultiple( RuntimeThread currentThread, SafeWaitHandle[] safeWaitHandles, int count, int millisecondsTimeout, bool waitAll) { Debug.Assert(currentThread == RuntimeThread.CurrentThread); Debug.Assert(safeWaitHandles != null); Debug.Assert(safeWaitHandles.Length >= count); // If we need to call SynchronizationContext.Wait method, always allocate a new IntPtr[] SynchronizationContext context = currentThread.SynchronizationContext; bool useSyncContextWait = (context != null) && context.IsWaitNotificationRequired(); IntPtr[] rentedHandles = useSyncContextWait ? null : currentThread.RentWaitedHandleArray(count); IntPtr[] handles = rentedHandles ?? new IntPtr[count]; try { for (int i = 0; i < count; i++) { handles[i] = safeWaitHandles[i].DangerousGetHandle(); } if (useSyncContextWait) { return(context.Wait(handles, waitAll, millisecondsTimeout)); } unsafe { fixed(IntPtr *pHandles = handles) { return(WaitForMultipleObjectsIgnoringSyncContext(pHandles, count, waitAll, millisecondsTimeout, true)); } } } finally { if (rentedHandles != null) { currentThread.ReturnWaitedHandleArray(rentedHandles); } } }