Code:
/ 4.0 / 4.0 / 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. //------------------------------------------------------------------------------ // 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
- Errors.cs
- Variable.cs
- Int16.cs
- GridViewDeleteEventArgs.cs
- TypeListConverter.cs
- RawMouseInputReport.cs
- TabOrder.cs
- PerformanceCounterLib.cs
- ParameterCollection.cs
- keycontainerpermission.cs
- RowUpdatingEventArgs.cs
- Baml2006KeyRecord.cs
- WebBaseEventKeyComparer.cs
- OpenTypeCommon.cs
- AsnEncodedData.cs
- LinqDataSourceContextData.cs
- SqlNode.cs
- Quaternion.cs
- AbsoluteQuery.cs
- precedingsibling.cs
- InteropExecutor.cs
- MetadataResolver.cs
- TileBrush.cs
- DialogResultConverter.cs
- ContainerAction.cs
- Exceptions.cs
- DataListItem.cs
- DataControlField.cs
- SQLString.cs
- BitmapSource.cs
- OrderablePartitioner.cs
- InputBinder.cs
- PropertyValueChangedEvent.cs
- SystemIcons.cs
- DrawingAttributesDefaultValueFactory.cs
- Rotation3DAnimationUsingKeyFrames.cs
- ArrangedElement.cs
- LinearGradientBrush.cs
- UnaryNode.cs
- TableCell.cs
- SqlCrossApplyToCrossJoin.cs
- PersonalizablePropertyEntry.cs
- InfoCardSymmetricCrypto.cs
- TypeUnloadedException.cs
- XmlReaderSettings.cs
- ComponentRenameEvent.cs
- GroupedContextMenuStrip.cs
- FileDialog.cs
- DataGridViewCellStyleEditor.cs
- ClientApiGenerator.cs
- ComponentChangingEvent.cs
- XPathDescendantIterator.cs
- AddInController.cs
- WSDualHttpBindingCollectionElement.cs
- NoResizeSelectionBorderGlyph.cs
- SapiRecognizer.cs
- SQLBytes.cs
- LineServicesCallbacks.cs
- log.cs
- LineBreakRecord.cs
- FeatureSupport.cs
- EventLogEntryCollection.cs
- XamlSerializationHelper.cs
- Internal.cs
- ComponentCommands.cs
- CodeParameterDeclarationExpression.cs
- CodeAttributeDeclarationCollection.cs
- TemplatedControlDesigner.cs
- MobileErrorInfo.cs
- BamlBinaryReader.cs
- ClientSponsor.cs
- WebPartMovingEventArgs.cs
- AppSettingsReader.cs
- ChannelManager.cs
- RepeaterDataBoundAdapter.cs
- SqlInternalConnectionTds.cs
- ServiceMoniker.cs
- SettingsBase.cs
- NetSectionGroup.cs
- Pen.cs
- XmlEncoding.cs
- InputChannelBinder.cs
- CodeTypeDeclaration.cs
- ApplicationServiceManager.cs
- StringResourceManager.cs
- ChainOfResponsibility.cs
- ComplexPropertyEntry.cs
- DataSourceDesigner.cs
- designeractionbehavior.cs
- BoundPropertyEntry.cs
- safex509handles.cs
- IIS7UserPrincipal.cs
- EpmCustomContentSerializer.cs
- ActivitySurrogateSelector.cs
- XsdDateTime.cs
- CachedPathData.cs
- QueueProcessor.cs
- UnsafeNativeMethods.cs
- ChangePasswordAutoFormat.cs
- IdentityHolder.cs