//////////////////////////////////////////////////////////////////////////////// // // Microsoft Research Singularity // // Copyright (c) Microsoft Corporation. All rights reserved. // // File: AutoResetEvent.cs // // Note: // using System; using System.Runtime.CompilerServices; using Microsoft.Singularity; using Microsoft.Singularity.Io; using Microsoft.Singularity.Scheduling; namespace System.Threading { /// /// /// Event class implementing an event with auto reset symantics such event automatically /// reset to non signaled state when single wait is satisfied /// /// [NoCCtor] [CLSCompliant(false)] public sealed class AutoResetEvent : WaitHandle { /// /// /// Constructor /// /// /// Initial state of an event true indciates that event is signaled /// public AutoResetEvent(bool initialState) : base(initialState ? WaitHandle.SignalState.Signaled : WaitHandle.SignalState.Unsignaled, WaitHandle.SignalState.Unsignaled, SpinLock.Types.AutoResetEvent) { } /// /// /// Reset an event state to non signaled /// /// [NoHeapAllocation] public bool Reset() { // Make sure that we don't have any waiters and then change event state to unsignaled // in all the cases SignalAll (WaitHandle.SignalState.Unsignaled, WaitHandle.SignalState.Unsignaled); return true; } /// /// /// Wake up one waiter, if no waiters present set event into signaled state /// /// [NoHeapAllocation] public bool Set() { // Signal one waiter if present otherwise set event to signaled SignalOne(WaitHandle.SignalState.Signaled); return true; } /// /// /// Wake up all waiters and if event is not signaled set it into signaled state /// /// public bool SetAll() { SignalAll (WaitHandle.SignalState.Signaled,WaitHandle.SignalState.Unsignaled); return true; } } }