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
- AnnotationResourceCollection.cs
- Unit.cs
- CustomErrorsSectionWrapper.cs
- PropertyGeneratedEventArgs.cs
- WebProxyScriptElement.cs
- IndexedString.cs
- ProtocolsSection.cs
- SettingsSection.cs
- DataGridLinkButton.cs
- ConfigXmlAttribute.cs
- ThousandthOfEmRealPoints.cs
- ReflectPropertyDescriptor.cs
- RawContentTypeMapper.cs
- StringSorter.cs
- SingleConverter.cs
- BevelBitmapEffect.cs
- WinCategoryAttribute.cs
- OptimalTextSource.cs
- SpeechRecognizer.cs
- SystemParameters.cs
- Vector3DIndependentAnimationStorage.cs
- CachedRequestParams.cs
- UnsafeNetInfoNativeMethods.cs
- ChannelFactoryRefCache.cs
- OperationInfo.cs
- Gdiplus.cs
- AppSettings.cs
- XPathBinder.cs
- AnnotationDocumentPaginator.cs
- ProcessModuleDesigner.cs
- FontFamilyValueSerializer.cs
- CellConstantDomain.cs
- ObjectConverter.cs
- AppSettingsExpressionBuilder.cs
- CommandConverter.cs
- WindowsStatic.cs
- ObjectDataSourceStatusEventArgs.cs
- AppSettingsExpressionBuilder.cs
- QilBinary.cs
- LookupNode.cs
- SupportsEventValidationAttribute.cs
- XmlTextAttribute.cs
- QueryResponse.cs
- PrtCap_Base.cs
- ImageListUtils.cs
- PingReply.cs
- WebUtility.cs
- Glyph.cs
- TextLine.cs
- Triplet.cs
- Opcode.cs
- CompilerScopeManager.cs
- MessageDecoder.cs
- TextMetrics.cs
- SessionPageStatePersister.cs
- InkCanvasSelection.cs
- AsyncCallback.cs
- FixedSOMImage.cs
- ConstantExpression.cs
- MemberDomainMap.cs
- PreservationFileReader.cs
- RoutedEventArgs.cs
- StrokeNode.cs
- TriggerBase.cs
- TcpAppDomainProtocolHandler.cs
- RawStylusInputReport.cs
- ListBindingConverter.cs
- SchemaComplexType.cs
- CollectionConverter.cs
- ConstraintEnumerator.cs
- AllMembershipCondition.cs
- DynamicDiscoveryDocument.cs
- Configuration.cs
- SmtpReplyReader.cs
- CopyNamespacesAction.cs
- InstanceNotReadyException.cs
- ListViewInsertionMark.cs
- OrderedDictionary.cs
- ListBox.cs
- ConversionHelper.cs
- DbConnectionFactory.cs
- ResourceDictionaryCollection.cs
- SqlInternalConnectionSmi.cs
- HelloMessage11.cs
- EncodingTable.cs
- AnimationClockResource.cs
- ProfileGroupSettingsCollection.cs
- TransformCollection.cs
- TypeUtil.cs
- XmlObjectSerializerReadContext.cs
- DigitShape.cs
- _OverlappedAsyncResult.cs
- Drawing.cs
- ExtensionDataReader.cs
- MultiByteCodec.cs
- WebPartHeaderCloseVerb.cs
- BorderSidesEditor.cs
- RbTree.cs
- BaseDataList.cs
- BaseTemplateParser.cs