singrdk/base/Kernel/Singularity/V1/Threads/ManualResetEventHandle.cs

101 lines
3.1 KiB
C#
Raw Permalink Normal View History

2008-03-05 09:52:00 -05:00
////////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity - Singularity ABI
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// File: ManualResetEventHandle.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 ManualResetEventHandle // : public SyncHandle
{
public readonly UIntPtr id; // could be moved to SyncHandle
public static readonly ManualResetEventHandle Zero = new ManualResetEventHandle();
internal ManualResetEventHandle(UIntPtr id)
{
this.id = id;
}
[ExternalEntryPoint]
public static unsafe bool CreateImpl(
bool initialState,
ManualResetEventHandle * handle)
{
return Create(initialState, out *handle);
}
public static bool Create(bool initialState,
out ManualResetEventHandle handle)
{
//
// Create a new manual-reset event, and a handle in the current
// process to hold it.
//
handle = new ManualResetEventHandle(
Thread.CurrentProcess.AllocateHandle(
new ManualResetEvent(initialState)));
Tracing.Log(Tracing.Debug, "ManualResetEventHandle.Create(state=, out id={0:x8})",
handle.id);
return true;
}
[ExternalEntryPoint]
public static void Dispose(ManualResetEventHandle handle)
{
Tracing.Log(Tracing.Debug, "ManualResetEventHandle.Dispose(id={0:x8})",
handle.id);
//
// Releasing the handle will allow the manual-reset event to be
// garbage-collected.
//
Thread.CurrentProcess.ReleaseHandle(handle.id);
}
[ExternalEntryPoint]
public static bool Reset(ManualResetEventHandle handle)
{
//
// Convert the handle to a manual-reset event; reset the event.
//
ManualResetEvent mre = HandleTable.GetHandle(handle.id) as ManualResetEvent;
bool ret = mre.Reset();
Tracing.Log(Tracing.Debug, "ManualResetEventHandle.Reset(id={0:x8})",
handle.id);
return ret;
}
[ExternalEntryPoint]
public static bool Set(ManualResetEventHandle handle)
{
//
// Convert the handle to a manual-reset event; set the event.
//
ManualResetEvent mre = HandleTable.GetHandle(handle.id) as ManualResetEvent;
bool ret = mre.Set();
Tracing.Log(Tracing.Debug, "ManualResetEventHandle.Set(id={0:x8})",
handle.id);
return ret;
}
}
}