126 lines
3.9 KiB
C#
126 lines
3.9 KiB
C#
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Microsoft Research Singularity - Singularity ABI
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// File: AutoResetEventHandle.csi
|
|
//
|
|
// 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 AutoResetEventHandle // : public SyncHandle
|
|
{
|
|
public readonly UIntPtr id; // could be moved to SyncHandle
|
|
|
|
public static readonly AutoResetEventHandle Zero = new AutoResetEventHandle();
|
|
|
|
internal AutoResetEventHandle(UIntPtr id)
|
|
{
|
|
this.id = id;
|
|
}
|
|
|
|
[ExternalEntryPoint]
|
|
public static unsafe bool CreateImpl(
|
|
bool initialState,
|
|
AutoResetEventHandle * handle)
|
|
{
|
|
return Create(initialState, out *handle);
|
|
}
|
|
|
|
public static bool Create(bool initialState,
|
|
out AutoResetEventHandle handle)
|
|
{
|
|
//
|
|
// Create a new auto-reset event, and a handle in the current
|
|
// process to hold it.
|
|
//
|
|
handle = new AutoResetEventHandle(
|
|
Thread.CurrentProcess.AllocateHandle(
|
|
new AutoResetEvent(initialState)));
|
|
|
|
Tracing.Log(Tracing.Debug, "AutoResetEventHandle.Create(state=, out id={0:x8})",
|
|
handle.id);
|
|
return true;
|
|
}
|
|
|
|
[ExternalEntryPoint]
|
|
public static void Dispose(AutoResetEventHandle handle)
|
|
{
|
|
Dispose(Thread.CurrentProcess, handle);
|
|
}
|
|
|
|
internal static void Dispose(Process process,
|
|
AutoResetEventHandle handle)
|
|
{
|
|
Tracing.Log(Tracing.Debug, "AutoResetEventHandle.Dispose(id={0:x8})",
|
|
handle.id);
|
|
//
|
|
// Releasing the handle will allow the auto-reset event to be
|
|
// garbage-collected.
|
|
//
|
|
process.ReleaseHandle(handle.id);
|
|
}
|
|
|
|
[ExternalEntryPoint]
|
|
public static bool Reset(AutoResetEventHandle handle)
|
|
{
|
|
//
|
|
// Convert the handle to an auto-reset event; reset the event.
|
|
//
|
|
AutoResetEvent are = HandleTable.GetHandle(handle.id) as AutoResetEvent;
|
|
bool ret = are.Reset();
|
|
|
|
Tracing.Log(Tracing.Debug, "AutoResetEventHandle.Reset(id={0:x8})",
|
|
handle.id);
|
|
|
|
return ret;
|
|
}
|
|
|
|
[ExternalEntryPoint]
|
|
public static bool Set(AutoResetEventHandle handle)
|
|
{
|
|
//
|
|
// Convert the handle to an auto-reset event; set the event.
|
|
//
|
|
AutoResetEvent are = HandleTable.GetHandle(handle.id) as AutoResetEvent;
|
|
bool ret = are.Set();
|
|
|
|
Tracing.Log(Tracing.Debug, "AutoResetEventHandle.Set(id={0:x8})",
|
|
handle.id);
|
|
|
|
return ret;
|
|
}
|
|
|
|
[ExternalEntryPoint]
|
|
public static bool SetAll(AutoResetEventHandle handle)
|
|
{
|
|
//
|
|
// Convert the handle to an auto-reset event; set the event.
|
|
//
|
|
AutoResetEvent are = HandleTable.GetHandle(handle.id) as AutoResetEvent;
|
|
bool ret = are.SetAll();
|
|
|
|
Tracing.Log(Tracing.Debug, "AutoResetEventHandle.SetAll(id={0:x8})",
|
|
handle.id);
|
|
|
|
return ret;
|
|
}
|
|
|
|
[ExternalEntryPoint(IgnoreCallerTransition=1)]
|
|
public static bool SetNoGC(AutoResetEventHandle handle) {
|
|
return Set(handle);
|
|
}
|
|
}
|
|
}
|