Xamarin Public Jenkins (auto-signing) ef583813eb Imported Upstream version 6.4.0.137
Former-commit-id: 943baa9f16a098c33e129777827f3a9d20da00d6
2019-07-26 19:53:28 +00:00

68 lines
2.1 KiB
C#

using System.Runtime.CompilerServices;
using System.IO;
namespace System.Threading
{
partial class Mutex
{
Mutex (IntPtr handle) => Handle = handle;
public void ReleaseMutex ()
{
if (!ReleaseMutex_internal (Handle))
throw new ApplicationException (SR.Arg_SynchronizationLockException);
}
void CreateMutexCore (bool initiallyOwned, string name, out bool createdNew) =>
Handle = CreateMutex_internal (initiallyOwned, name, out createdNew);
unsafe static IntPtr CreateMutex_internal (bool initiallyOwned, string name, out bool created)
{
fixed (char *fixed_name = name)
return CreateMutex_icall (initiallyOwned, fixed_name,
name?.Length ?? 0, out created);
}
static OpenExistingResult OpenExistingWorker (string name, out Mutex result)
{
if (name == null)
throw new ArgumentNullException (nameof (name));
result = null;
if ((name.Length == 0) ||
(name.Length > 260)) {
return OpenExistingResult.NameInvalid;
}
MonoIOError error;
IntPtr handle = OpenMutex_internal (name, out error);
if (handle == IntPtr.Zero) {
if (error == MonoIOError.ERROR_FILE_NOT_FOUND) {
return OpenExistingResult.NameNotFound;
} else if (error == MonoIOError.ERROR_ACCESS_DENIED) {
throw new UnauthorizedAccessException ();
} else {
return OpenExistingResult.PathNotFound;
}
}
result = new Mutex (handle);
return OpenExistingResult.Success;
}
unsafe static IntPtr OpenMutex_internal (string name, out MonoIOError error)
{
fixed (char *fixed_name = name)
return OpenMutex_icall (fixed_name, name?.Length ?? 0, 0x000001 /* MutexRights.Modify */, out error);
}
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private unsafe static extern IntPtr CreateMutex_icall (bool initiallyOwned, char *name, int name_length, out bool created);
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private unsafe static extern IntPtr OpenMutex_icall (char *name, int name_length, int rights, out MonoIOError error);
[MethodImplAttribute(MethodImplOptions.InternalCall)]
private static extern bool ReleaseMutex_internal (IntPtr handle);
}
}