Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / System.Runtime.DurableInstancing / System / Runtime / SignalGate.cs / 1305376 / SignalGate.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.Runtime { using System; using System.Threading; [Fx.Tag.SynchronizationPrimitive(Fx.Tag.BlocksUsing.NonBlocking)] class SignalGate { [Fx.Tag.SynchronizationObject(Blocking=false, Kind=Fx.Tag.SynchronizationKind.InterlockedNoSpin)] int state; public SignalGate() { } internal bool IsLocked { get { return this.state == GateState.Locked; } } internal bool IsSignalled { get { return this.state == GateState.Signalled; } } // Returns true if this brings the gate to the Signalled state. // Transitions - Locked -> SignalPending | Completed before it was unlocked // Unlocked -> Signaled public bool Signal() { int lastState = this.state; if (lastState == GateState.Locked) { lastState = Interlocked.CompareExchange(ref this.state, GateState.SignalPending, GateState.Locked); } if (lastState == GateState.Unlocked) { this.state = GateState.Signalled; return true; } if (lastState != GateState.Locked) { ThrowInvalidSignalGateState(); } return false; } // Returns true if this brings the gate to the Signalled state. // Transitions - SignalPending -> Signaled | return the AsyncResult since the callback already // | completed and provided the result on its thread // Locked -> Unlocked public bool Unlock() { int lastState = this.state; if (lastState == GateState.Locked) { lastState = Interlocked.CompareExchange(ref this.state, GateState.Unlocked, GateState.Locked); } if (lastState == GateState.SignalPending) { this.state = GateState.Signalled; return true; } if (lastState != GateState.Locked) { ThrowInvalidSignalGateState(); } return false; } // This is factored out to allow Signal and Unlock to be inlined. void ThrowInvalidSignalGateState() { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.InvalidSemaphoreExit)); } static class GateState { public const int Locked = 0; public const int SignalPending = 1; public const int Unlocked = 2; public const int Signalled = 3; } } [Fx.Tag.SynchronizationPrimitive(Fx.Tag.BlocksUsing.NonBlocking)] class SignalGate: SignalGate { T result; public SignalGate() : base() { } public bool Signal(T result) { this.result = result; return Signal(); } public bool Unlock(out T result) { if (Unlock()) { result = this.result; return true; } result = default(T); return false; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- NetworkAddressChange.cs
- DataColumnCollection.cs
- TaskResultSetter.cs
- DataStreams.cs
- WindowsStartMenu.cs
- InvalidOperationException.cs
- ScriptManager.cs
- DockProviderWrapper.cs
- SoapHeaderException.cs
- DocumentViewerConstants.cs
- _FixedSizeReader.cs
- OneOf.cs
- Number.cs
- QuaternionRotation3D.cs
- Hyperlink.cs
- ContextMenu.cs
- SvcMapFileSerializer.cs
- ConsumerConnectionPoint.cs
- ConnectionManagementElementCollection.cs
- RelatedEnd.cs
- MouseDevice.cs
- DataGridViewRow.cs
- UnauthorizedAccessException.cs
- PolyQuadraticBezierSegment.cs
- TabControlAutomationPeer.cs
- ShaderEffect.cs
- MimeMapping.cs
- WpfKnownMemberInvoker.cs
- EnumMember.cs
- AccessText.cs
- PositiveTimeSpanValidatorAttribute.cs
- DesignerTransactionCloseEvent.cs
- GenericEnumConverter.cs
- PerformanceCounter.cs
- XPathItem.cs
- ISAPIApplicationHost.cs
- DependencyProperty.cs
- SafeViewOfFileHandle.cs
- XmlWrappingReader.cs
- DataListCommandEventArgs.cs
- BitmapEffectGroup.cs
- EnvelopeVersion.cs
- KeyedHashAlgorithm.cs
- RangeValuePatternIdentifiers.cs
- DataGridViewRowPrePaintEventArgs.cs
- SqlProfileProvider.cs
- Point3DCollectionValueSerializer.cs
- PathSegmentCollection.cs
- TargetException.cs
- NumericUpDown.cs
- BoundField.cs
- XmlSchemaType.cs
- XmlDataCollection.cs
- HttpApplicationFactory.cs
- SvcMapFile.cs
- ViewStateModeByIdAttribute.cs
- HttpResponseInternalWrapper.cs
- StringFormat.cs
- TiffBitmapDecoder.cs
- contentDescriptor.cs
- Msmq4SubqueuePoisonHandler.cs
- StatusStrip.cs
- XMLSchema.cs
- CommonRemoteMemoryBlock.cs
- WmlLinkAdapter.cs
- ConvertersCollection.cs
- CornerRadiusConverter.cs
- DefaultMergeHelper.cs
- SpanIndex.cs
- SByteStorage.cs
- XmlWriterTraceListener.cs
- DBCommandBuilder.cs
- SimpleExpression.cs
- CounterSampleCalculator.cs
- TreeViewItem.cs
- TrailingSpaceComparer.cs
- HtmlLinkAdapter.cs
- ClientSideProviderDescription.cs
- LocationReference.cs
- ResourceDefaultValueAttribute.cs
- ServerValidateEventArgs.cs
- StringAnimationBase.cs
- XsltFunctions.cs
- ModelItemCollection.cs
- FixedElement.cs
- Vector.cs
- DataTableNewRowEvent.cs
- StringArrayConverter.cs
- CodeDomSerializer.cs
- FileDataSourceCache.cs
- StringAttributeCollection.cs
- PriorityChain.cs
- Input.cs
- MultiBindingExpression.cs
- ParentQuery.cs
- SqlCommandBuilder.cs
- XmlRawWriter.cs
- Rules.cs
- PropertyChangingEventArgs.cs
- GridViewUpdatedEventArgs.cs