diff options
Diffstat (limited to 'src/System.Private.CoreLib/shared/System/Threading/Mutex.cs')
-rw-r--r-- | src/System.Private.CoreLib/shared/System/Threading/Mutex.cs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/System.Private.CoreLib/shared/System/Threading/Mutex.cs b/src/System.Private.CoreLib/shared/System/Threading/Mutex.cs new file mode 100644 index 000000000..d85242892 --- /dev/null +++ b/src/System.Private.CoreLib/shared/System/Threading/Mutex.cs @@ -0,0 +1,62 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.IO; +using Microsoft.Win32; +using Microsoft.Win32.SafeHandles; +using System.Runtime.InteropServices; +using System.Diagnostics; + +namespace System.Threading +{ + /// <summary> + /// Synchronization primitive that can also be used for interprocess synchronization + /// </summary> + public sealed partial class Mutex : WaitHandle + { + public Mutex(bool initiallyOwned, string name, out bool createdNew) + { + CreateMutexCore(initiallyOwned, name, out createdNew); + } + + public Mutex(bool initiallyOwned, string name) + { + CreateMutexCore(initiallyOwned, name, out _); + } + + public Mutex(bool initiallyOwned) + { + CreateMutexCore(initiallyOwned, null, out _); + } + + public Mutex() + { + CreateMutexCore(false, null, out _); + } + + private Mutex(SafeWaitHandle handle) + { + SafeWaitHandle = handle; + } + + public static Mutex OpenExisting(string name) + { + switch (OpenExistingWorker(name, out Mutex result)) + { + case OpenExistingResult.NameNotFound: + throw new WaitHandleCannotBeOpenedException(); + case OpenExistingResult.NameInvalid: + throw new WaitHandleCannotBeOpenedException(SR.Format(SR.Threading_WaitHandleCannotBeOpenedException_InvalidHandle, name)); + case OpenExistingResult.PathNotFound: + throw new DirectoryNotFoundException(SR.Format(SR.IO_PathNotFound_Path, name)); + + default: + return result; + } + } + + public static bool TryOpenExisting(string name, out Mutex result) => + OpenExistingWorker(name, out result) == OpenExistingResult.Success; + } +} |