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
- BitmapVisualManager.cs
- TableRow.cs
- HttpModuleCollection.cs
- WebPartEventArgs.cs
- InputScopeManager.cs
- WebServiceMethodData.cs
- InputLangChangeEvent.cs
- BindingObserver.cs
- XmlILIndex.cs
- HandlerFactoryWrapper.cs
- GPPOINTF.cs
- SizeKeyFrameCollection.cs
- SymbolEqualComparer.cs
- CacheDependency.cs
- LayoutSettings.cs
- XomlCompilerHelpers.cs
- CounterSample.cs
- CodeCatchClause.cs
- PointAnimationUsingPath.cs
- XmlQualifiedName.cs
- Parser.cs
- FacetValueContainer.cs
- FixedSOMSemanticBox.cs
- DropShadowBitmapEffect.cs
- Baml2006Reader.cs
- Buffer.cs
- PresentationTraceSources.cs
- UriSection.cs
- TemplateXamlTreeBuilder.cs
- X509CertificateInitiatorServiceCredential.cs
- SendActivityDesignerTheme.cs
- BindingNavigatorDesigner.cs
- FillRuleValidation.cs
- DBNull.cs
- ConfigXmlWhitespace.cs
- DiagnosticsConfigurationHandler.cs
- VariantWrapper.cs
- _SecureChannel.cs
- XmlReaderSettings.cs
- ContentPosition.cs
- UInt64Storage.cs
- OdbcDataReader.cs
- ObjectConverter.cs
- KnownBoxes.cs
- KerberosRequestorSecurityToken.cs
- ByteAnimationUsingKeyFrames.cs
- Rect3DConverter.cs
- SpanIndex.cs
- TypeBuilderInstantiation.cs
- Model3DGroup.cs
- MouseEvent.cs
- RewritingSimplifier.cs
- RawUIStateInputReport.cs
- ProcessingInstructionAction.cs
- XmlText.cs
- SecurityAppliedMessage.cs
- NavigateUrlConverter.cs
- DataKey.cs
- Events.cs
- ChannelManager.cs
- Viewport3DAutomationPeer.cs
- HMACMD5.cs
- SqlUtils.cs
- CommandDesigner.cs
- PropertyReferenceSerializer.cs
- DeclarativeCatalogPart.cs
- HttpListenerResponse.cs
- Image.cs
- UriSchemeKeyedCollection.cs
- Button.cs
- IPEndPoint.cs
- ClientCultureInfo.cs
- DeleteHelper.cs
- URLString.cs
- Vector3DValueSerializer.cs
- AdjustableArrowCap.cs
- WCFServiceClientProxyGenerator.cs
- QueryUtil.cs
- LayoutManager.cs
- HtmlElementErrorEventArgs.cs
- MultiView.cs
- _HelperAsyncResults.cs
- QuaternionAnimationUsingKeyFrames.cs
- SqlCrossApplyToCrossJoin.cs
- CursorConverter.cs
- MultipleViewPatternIdentifiers.cs
- ErrorHandler.cs
- ModelUIElement3D.cs
- PreservationFileWriter.cs
- CodeConditionStatement.cs
- TextRangeEdit.cs
- XmlSortKey.cs
- CounterSample.cs
- ContentPropertyAttribute.cs
- SortExpressionBuilder.cs
- Section.cs
- VectorCollection.cs
- WebPartsPersonalization.cs
- ObjectPersistData.cs
- OutOfMemoryException.cs