96 lines
2.9 KiB
C#
96 lines
2.9 KiB
C#
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Microsoft Research Singularity - Singularity ABI
|
||
|
//
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//
|
||
|
// File: MutexHandle.cs
|
||
|
//
|
||
|
// Note:
|
||
|
//
|
||
|
|
||
|
using System;
|
||
|
using System.Runtime.CompilerServices;
|
||
|
using System.Threading;
|
||
|
using Microsoft.Singularity;
|
||
|
using Microsoft.Singularity.Memory;
|
||
|
using Microsoft.Singularity.V1.Services;
|
||
|
|
||
|
namespace Microsoft.Singularity.V1.Threads
|
||
|
{
|
||
|
[CLSCompliant(false)]
|
||
|
public struct MutexHandle // : public SyncHandle
|
||
|
{
|
||
|
public readonly UIntPtr id; // could be moved to SyncHandle
|
||
|
|
||
|
public static readonly MutexHandle Zero = new MutexHandle();
|
||
|
|
||
|
internal MutexHandle(UIntPtr id)
|
||
|
{
|
||
|
this.id = id;
|
||
|
}
|
||
|
|
||
|
[ExternalEntryPoint]
|
||
|
public static unsafe bool CreateImpl(
|
||
|
bool initiallyOwned,
|
||
|
MutexHandle * handle)
|
||
|
{
|
||
|
return Create(initiallyOwned, out *handle);
|
||
|
}
|
||
|
|
||
|
public static bool Create(bool initiallyOwned,
|
||
|
out MutexHandle handle)
|
||
|
{
|
||
|
//
|
||
|
// Create a new mutex, and a handle in the current process
|
||
|
// to hold it.
|
||
|
//
|
||
|
handle = new MutexHandle(Thread.CurrentProcess.AllocateHandle(
|
||
|
new Mutex(initiallyOwned)));
|
||
|
|
||
|
Tracing.Log(Tracing.Debug, "MutexHandle.Create(, out id={0:x8})",
|
||
|
handle.id);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
[ExternalEntryPoint]
|
||
|
public static void Dispose(MutexHandle handle)
|
||
|
{
|
||
|
Tracing.Log(Tracing.Debug, "MutexHandle.Dispose(id={0:x8})",
|
||
|
handle.id);
|
||
|
|
||
|
//
|
||
|
// Releasing the handle will allow the mutex to be
|
||
|
// garbage-collected.
|
||
|
//
|
||
|
Thread.CurrentProcess.ReleaseHandle(handle.id);
|
||
|
}
|
||
|
|
||
|
[ExternalEntryPoint]
|
||
|
public static void Release(MutexHandle handle)
|
||
|
{
|
||
|
Tracing.Log(Tracing.Debug, "MutexHandle.Release(id={0:x8})",
|
||
|
handle.id);
|
||
|
|
||
|
//
|
||
|
// Convert the handle to a mutex; release the mutex.
|
||
|
//
|
||
|
Mutex mutex = HandleTable.GetHandle(handle.id) as Mutex;
|
||
|
mutex.ReleaseMutex();
|
||
|
}
|
||
|
|
||
|
[ExternalEntryPoint]
|
||
|
public static bool IsOwnedByCurrentThread(MutexHandle handle)
|
||
|
{
|
||
|
Tracing.Log(Tracing.Debug, "MutexHandle.IsOwnedByCurrentThread(id={0:x8})",
|
||
|
handle.id);
|
||
|
|
||
|
//
|
||
|
// Convert the handle to a mutex; check the ownership of the mutex.
|
||
|
//
|
||
|
Mutex mutex = HandleTable.GetHandle(handle.id) as Mutex;
|
||
|
return mutex.IsOwnedByCurrentThread();
|
||
|
}
|
||
|
}
|
||
|
}
|