public static int Wait( RuntimeThread currentThread, WaitableObject waitableObject0, WaitableObject waitableObject1, bool waitForAll, int timeoutMilliseconds, bool interruptible = true, bool prioritize = false) { Debug.Assert(currentThread == RuntimeThread.CurrentThread); Debug.Assert(waitableObject0 != null); Debug.Assert(waitableObject1 != null); Debug.Assert(waitableObject1 != waitableObject0); Debug.Assert(timeoutMilliseconds >= -1); ThreadWaitInfo waitInfo = currentThread.WaitInfo; int count = 2; WaitableObject[] waitableObjects = waitInfo.GetWaitedObjectArray(count); waitableObjects[0] = waitableObject0; waitableObjects[1] = waitableObject1; return (WaitableObject.Wait( waitableObjects, count, waitForAll, waitInfo, timeoutMilliseconds, interruptible, prioritize, waitHandlesForAbandon: null)); }
public static int Wait( WaitableObject waitableObject, int timeoutMilliseconds, bool interruptible = true, bool prioritize = false) { Debug.Assert(waitableObject != null); Debug.Assert(timeoutMilliseconds >= -1); return(waitableObject.Wait(Thread.CurrentThread.WaitInfo, timeoutMilliseconds, interruptible, prioritize)); }
public static SafeWaitHandle NewMutex(bool initiallyOwned) { WaitableObject waitableObject = WaitableObject.NewMutex(); SafeWaitHandle safeWaitHandle = NewHandle(waitableObject); if (!initiallyOwned) { return(safeWaitHandle); } // Acquire the mutex. A thread's <see cref="ThreadWaitInfo"/> has a reference to all <see cref="Mutex"/>es locked // by the thread. See <see cref="ThreadWaitInfo.LockedMutexesHead"/>. So, acquire the lock only after all // possibilities for exceptions have been exhausted. ThreadWaitInfo waitInfo = Thread.CurrentThread.WaitInfo; bool acquiredLock = waitableObject.Wait(waitInfo, timeoutMilliseconds: 0, interruptible: false, prioritize: false) == 0; Debug.Assert(acquiredLock); return(safeWaitHandle); }
public static int Wait( Span <IntPtr> waitHandles, bool waitForAll, int timeoutMilliseconds) { Debug.Assert(waitHandles != null); Debug.Assert(waitHandles.Length > 0); Debug.Assert(waitHandles.Length <= WaitHandle.MaxWaitHandles); Debug.Assert(timeoutMilliseconds >= -1); ThreadWaitInfo waitInfo = Thread.CurrentThread.WaitInfo; WaitableObject?[] waitableObjects = waitInfo.GetWaitedObjectArray(waitHandles.Length); bool success = false; try { for (int i = 0; i < waitHandles.Length; ++i) { Debug.Assert(waitHandles[i] != IntPtr.Zero); WaitableObject waitableObject = HandleManager.FromHandle(waitHandles[i]); if (waitForAll) { // Check if this is a duplicate, as wait-for-all does not support duplicates. Including the parent // loop, this becomes a brute force O(n^2) search, which is intended since the typical array length is // short enough that this would actually be faster than other alternatives. Also, the worst case is not // so bad considering that the array length is limited by <see cref="WaitHandle.MaxWaitHandles"/>. for (int j = 0; j < i; ++j) { if (waitableObject == waitableObjects[j]) { throw new DuplicateWaitObjectException("waitHandles[" + i + ']'); } } } waitableObjects[i] = waitableObject; } success = true; } finally { if (!success) { for (int i = 0; i < waitHandles.Length; ++i) { waitableObjects[i] = null; } } } if (waitHandles.Length == 1) { WaitableObject waitableObject = waitableObjects[0] !; waitableObjects[0] = null; return (waitableObject.Wait(waitInfo, timeoutMilliseconds, interruptible: true, prioritize: false)); } return (WaitableObject.Wait( waitableObjects, waitHandles.Length, waitForAll, waitInfo, timeoutMilliseconds, interruptible: true, prioritize: false)); }
public static int Wait( RuntimeThread currentThread, SafeWaitHandle[] safeWaitHandles, WaitHandle[] waitHandles, bool waitForAll, int timeoutMilliseconds) { Debug.Assert(currentThread == RuntimeThread.CurrentThread); Debug.Assert(safeWaitHandles != null); Debug.Assert(safeWaitHandles.Length >= waitHandles.Length); Debug.Assert(waitHandles.Length > 0); Debug.Assert(waitHandles.Length <= WaitHandle.MaxWaitHandles); Debug.Assert(timeoutMilliseconds >= -1); ThreadWaitInfo waitInfo = currentThread.WaitInfo; if (waitInfo.CheckAndResetPendingInterrupt) { throw new ThreadInterruptedException(); } int count = waitHandles.Length; WaitableObject[] waitableObjects = waitInfo.GetWaitedObjectArray(count); bool success = false; try { for (int i = 0; i < count; ++i) { Debug.Assert(safeWaitHandles[i] != null); WaitableObject waitableObject = HandleManager.FromHandle(safeWaitHandles[i].DangerousGetHandle()); if (waitForAll) { /// Check if this is a duplicate, as wait-for-all does not support duplicates. Including the parent /// loop, this becomes a brute force O(n^2) search, which is intended since the typical array length is /// short enough that this would actually be faster than other alternatives. Also, the worst case is not /// so bad considering that the array length is limited by <see cref="WaitHandle.MaxWaitHandles"/>. for (int j = 0; j < i; ++j) { if (waitableObject == waitableObjects[j]) { throw new DuplicateWaitObjectException("waitHandles[" + i + ']'); } } } waitableObjects[i] = waitableObject; } success = true; } finally { if (!success) { for (int i = 0; i < count; ++i) { waitableObjects[i] = null; } } } if (count == 1) { WaitableObject waitableObject = waitableObjects[0]; waitableObjects[0] = null; return(waitableObject.Wait(waitInfo, timeoutMilliseconds) ? 0 : WaitHandle.WaitTimeout); } return (WaitableObject.Wait( waitableObjects, count, waitForAll, waitInfo, timeoutMilliseconds, waitHandles)); }