102 lines
3.2 KiB
C#
102 lines
3.2 KiB
C#
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Microsoft Research Singularity - Singularity ABI
|
||
|
//
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//
|
||
|
// File: SyncHandle.cs
|
||
|
//
|
||
|
// Note:
|
||
|
//
|
||
|
|
||
|
using System;
|
||
|
using System.Runtime.CompilerServices;
|
||
|
|
||
|
namespace Microsoft.Singularity.V1.Threads
|
||
|
{
|
||
|
public struct SyncHandle // : public WaitHandle
|
||
|
{
|
||
|
public readonly UIntPtr id; // could be moved to WaitHandle
|
||
|
|
||
|
[Inline]
|
||
|
[NoHeapAllocation]
|
||
|
private SyncHandle(UIntPtr id)
|
||
|
{
|
||
|
this.id = id;
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
[NoHeapAllocation]
|
||
|
public static implicit operator SyncHandle(MutexHandle handle)
|
||
|
{
|
||
|
return new SyncHandle(handle.id);
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
[NoHeapAllocation]
|
||
|
public static implicit operator SyncHandle(AutoResetEventHandle handle)
|
||
|
{
|
||
|
return new SyncHandle(handle.id);
|
||
|
}
|
||
|
|
||
|
[Inline]
|
||
|
[NoHeapAllocation]
|
||
|
public static implicit operator SyncHandle(ManualResetEventHandle handle)
|
||
|
{
|
||
|
return new SyncHandle(handle.id);
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// The following methods could be moved to WaitHandle if we had
|
||
|
// struct inheritance.
|
||
|
//
|
||
|
[OutsideGCDomain]
|
||
|
[NoHeapAllocation]
|
||
|
[StackBound(1152)]
|
||
|
[MethodImpl(MethodImplOptions.InternalCall)]
|
||
|
public static extern bool WaitOne(SyncHandle handle);
|
||
|
|
||
|
[OutsideGCDomain]
|
||
|
[NoHeapAllocation]
|
||
|
[StackBound(1152)]
|
||
|
[MethodImpl(MethodImplOptions.InternalCall)]
|
||
|
public static extern bool WaitOne(SyncHandle handle,
|
||
|
TimeSpan timeout);
|
||
|
|
||
|
[OutsideGCDomain]
|
||
|
[NoHeapAllocation]
|
||
|
[StackBound(1152)]
|
||
|
[MethodImpl(MethodImplOptions.InternalCall)]
|
||
|
public static extern bool WaitOne(SyncHandle handle,
|
||
|
SchedulerTime stop);
|
||
|
|
||
|
[StackBound(1152)]
|
||
|
[MethodImpl(MethodImplOptions.InternalCall)]
|
||
|
public static extern bool WaitOneNoGC(SyncHandle handle);
|
||
|
|
||
|
[OutsideGCDomain]
|
||
|
[NoHeapAllocation]
|
||
|
[StackBound(1152)]
|
||
|
[MethodImpl(MethodImplOptions.InternalCall)]
|
||
|
public static extern unsafe int WaitAny(SyncHandle * handles,
|
||
|
int handleCount);
|
||
|
|
||
|
[OutsideGCDomain]
|
||
|
[NoHeapAllocation]
|
||
|
[StackBound(1152)]
|
||
|
[MethodImpl(MethodImplOptions.InternalCall)]
|
||
|
public static extern unsafe int WaitAny(SyncHandle * handles,
|
||
|
int handleCount,
|
||
|
TimeSpan timeout);
|
||
|
|
||
|
[OutsideGCDomain]
|
||
|
[NoHeapAllocation]
|
||
|
[StackBound(1152)]
|
||
|
[MethodImpl(MethodImplOptions.InternalCall)]
|
||
|
public static extern unsafe int WaitAny(SyncHandle * handles,
|
||
|
int handleCount,
|
||
|
SchedulerTime stop);
|
||
|
}
|
||
|
}
|