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
- NotCondition.cs
- ConstraintCollection.cs
- XmlSchemaParticle.cs
- TypeGenericEnumerableViewSchema.cs
- WebPartCloseVerb.cs
- control.ime.cs
- ProvidersHelper.cs
- NameValueConfigurationCollection.cs
- ReliableChannelBinder.cs
- DrawTreeNodeEventArgs.cs
- ProvideValueServiceProvider.cs
- List.cs
- SystemInfo.cs
- LookupBindingPropertiesAttribute.cs
- QueryExpr.cs
- LinqDataSourceStatusEventArgs.cs
- FormsAuthenticationCredentials.cs
- TemplatePartAttribute.cs
- securitymgrsite.cs
- HttpCapabilitiesSectionHandler.cs
- CqlParser.cs
- PassportAuthenticationEventArgs.cs
- TextTreeDeleteContentUndoUnit.cs
- TraceContextRecord.cs
- StateWorkerRequest.cs
- Certificate.cs
- HttpRequestBase.cs
- TimeZoneInfo.cs
- ListItemParagraph.cs
- assertwrapper.cs
- XmlArrayItemAttributes.cs
- FixedLineResult.cs
- RpcCryptoRequest.cs
- SqlFileStream.cs
- XdrBuilder.cs
- DataGridViewCellConverter.cs
- PopupEventArgs.cs
- EntityProviderServices.cs
- ImpersonateTokenRef.cs
- TextBlockAutomationPeer.cs
- SchemaImporterExtension.cs
- Trace.cs
- InputQueue.cs
- ObjectKeyFrameCollection.cs
- MultiDataTrigger.cs
- EventlogProvider.cs
- DispatcherHookEventArgs.cs
- WmpBitmapEncoder.cs
- NumericUpDownAcceleration.cs
- DynamicILGenerator.cs
- RegexStringValidator.cs
- SystemFonts.cs
- ClosableStream.cs
- EventLogPermissionEntryCollection.cs
- XPathNavigatorReader.cs
- ParameterBinding.cs
- ExecutionEngineException.cs
- BuildProviderCollection.cs
- ContextMenuService.cs
- BooleanAnimationUsingKeyFrames.cs
- ConsoleTraceListener.cs
- FontSizeConverter.cs
- TypePresenter.xaml.cs
- WindowsFormsSynchronizationContext.cs
- _Win32.cs
- WriteFileContext.cs
- WorkflowMessageEventHandler.cs
- TextParagraphProperties.cs
- _SSPISessionCache.cs
- SizeIndependentAnimationStorage.cs
- DebugViewWriter.cs
- PackageDigitalSignature.cs
- DesignConnectionCollection.cs
- EntryWrittenEventArgs.cs
- UIAgentMonitorHandle.cs
- DayRenderEvent.cs
- XslException.cs
- TextEndOfParagraph.cs
- PartialCachingControl.cs
- ModelUIElement3D.cs
- PropertyEntry.cs
- BCLDebug.cs
- RectValueSerializer.cs
- DoubleAnimation.cs
- SpeechDetectedEventArgs.cs
- SkewTransform.cs
- DataRowView.cs
- ScriptBehaviorDescriptor.cs
- BitmapCache.cs
- StartUpEventArgs.cs
- SQLMoney.cs
- ClientProxyGenerator.cs
- DataGridViewAddColumnDialog.cs
- FixedSOMFixedBlock.cs
- UnknownBitmapDecoder.cs
- InkCanvasAutomationPeer.cs
- ReliableOutputConnection.cs
- ComponentEvent.cs
- SqlDataSourceQuery.cs
- KerberosSecurityTokenAuthenticator.cs