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
- HostDesigntimeLicenseContext.cs
- util.cs
- DocumentPageTextView.cs
- EtwTrace.cs
- ObjectDataSourceView.cs
- QueueProcessor.cs
- Stylesheet.cs
- TabControlCancelEvent.cs
- EtwTrace.cs
- RadioButtonStandardAdapter.cs
- PeerMessageDispatcher.cs
- TypeBuilderInstantiation.cs
- PolyQuadraticBezierSegment.cs
- OrderByQueryOptionExpression.cs
- LongValidator.cs
- Semaphore.cs
- DefaultParameterValueAttribute.cs
- ClaimTypeElement.cs
- Win32Native.cs
- RayHitTestParameters.cs
- MatrixAnimationBase.cs
- PlainXmlDeserializer.cs
- DesignBindingConverter.cs
- RequestCacheEntry.cs
- COM2IPerPropertyBrowsingHandler.cs
- TypedTableGenerator.cs
- GradientBrush.cs
- XmlDataSourceNodeDescriptor.cs
- WebDisplayNameAttribute.cs
- OdbcParameter.cs
- WebServiceData.cs
- SystemColors.cs
- WebPartManager.cs
- Vector3DAnimationUsingKeyFrames.cs
- ApplicationSecurityInfo.cs
- ImpersonationOption.cs
- ProtocolsConfigurationHandler.cs
- GlyphRun.cs
- InkCanvasInnerCanvas.cs
- SystemIcons.cs
- HttpPostedFile.cs
- ArgumentNullException.cs
- ProgressiveCrcCalculatingStream.cs
- DataShape.cs
- CasesDictionary.cs
- ControlBindingsCollection.cs
- SoapParser.cs
- Listbox.cs
- IndexingContentUnit.cs
- ScaleTransform3D.cs
- XmlSchemaFacet.cs
- CapacityStreamGeometryContext.cs
- Zone.cs
- ReservationNotFoundException.cs
- OdbcConnectionPoolProviderInfo.cs
- SingleConverter.cs
- WebPartConnectionsCancelVerb.cs
- TemplatePagerField.cs
- DependencyObjectPropertyDescriptor.cs
- PackagingUtilities.cs
- UniqueContractNameValidationBehavior.cs
- MaterialGroup.cs
- Route.cs
- RegularExpressionValidator.cs
- PointCollection.cs
- RbTree.cs
- _SpnDictionary.cs
- SecurityTokenResolver.cs
- RepeaterCommandEventArgs.cs
- IInstanceTable.cs
- MultiAsyncResult.cs
- TemplateAction.cs
- ChangeConflicts.cs
- LinqToSqlWrapper.cs
- Run.cs
- FileDialog.cs
- MessagingDescriptionAttribute.cs
- KeySpline.cs
- MetadataUtilsSmi.cs
- Label.cs
- SqlUDTStorage.cs
- ReadOnlyPropertyMetadata.cs
- RawStylusInput.cs
- Funcletizer.cs
- WebServiceErrorEvent.cs
- StyleCollectionEditor.cs
- DependencyPropertyValueSerializer.cs
- HttpGetProtocolImporter.cs
- RowsCopiedEventArgs.cs
- HtmlImage.cs
- FirstMatchCodeGroup.cs
- UpDownEvent.cs
- TdsParserSessionPool.cs
- BitmapImage.cs
- NamedElement.cs
- TargetPerspective.cs
- TiffBitmapEncoder.cs
- EntityTransaction.cs
- QilTargetType.cs
- AxHost.cs