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); }