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
- RoutedUICommand.cs
- ModelTreeEnumerator.cs
- AutomationAttributeInfo.cs
- DataAdapter.cs
- LoadedOrUnloadedOperation.cs
- _ConnectStream.cs
- SetStoryboardSpeedRatio.cs
- QuaternionAnimationUsingKeyFrames.cs
- XmlSchemaValidationException.cs
- ToolZone.cs
- StaticSiteMapProvider.cs
- SchemaDeclBase.cs
- Margins.cs
- EdmComplexTypeAttribute.cs
- SafeTokenHandle.cs
- SqlProvider.cs
- CodeDelegateInvokeExpression.cs
- UseAttributeSetsAction.cs
- SourceElementsCollection.cs
- SerializationFieldInfo.cs
- mediaclock.cs
- XsltConvert.cs
- CorePropertiesFilter.cs
- PanelDesigner.cs
- ClientOptions.cs
- Win32.cs
- RootProjectionNode.cs
- List.cs
- TextCompositionManager.cs
- LiteralTextContainerControlBuilder.cs
- CodeRemoveEventStatement.cs
- SetStateDesigner.cs
- InstanceDataCollection.cs
- UnmanagedMarshal.cs
- MgmtConfigurationRecord.cs
- COM2AboutBoxPropertyDescriptor.cs
- Parameter.cs
- OleDbCommand.cs
- __FastResourceComparer.cs
- SoapSchemaExporter.cs
- GiveFeedbackEventArgs.cs
- PropertyPathConverter.cs
- DesignerDataStoredProcedure.cs
- ReadOnlyHierarchicalDataSourceView.cs
- BindingNavigator.cs
- MetaTable.cs
- Boolean.cs
- GeometryCollection.cs
- InfoCardProofToken.cs
- QueryExpr.cs
- LambdaExpression.cs
- DataSetSchema.cs
- EasingKeyFrames.cs
- DispatchRuntime.cs
- SubqueryRules.cs
- WasAdminWrapper.cs
- RequestQueryParser.cs
- DBBindings.cs
- TextServicesDisplayAttribute.cs
- HttpWriter.cs
- LinqTreeNodeEvaluator.cs
- UnmanagedHandle.cs
- StringExpressionSet.cs
- ScriptingProfileServiceSection.cs
- MenuCommands.cs
- HttpListenerPrefixCollection.cs
- SplineKeyFrames.cs
- TableLayoutSettings.cs
- ServiceDebugElement.cs
- DocumentSchemaValidator.cs
- ContainerUtilities.cs
- HiddenFieldPageStatePersister.cs
- EnumerableWrapperWeakToStrong.cs
- Html32TextWriter.cs
- StoreAnnotationsMap.cs
- ConsumerConnectionPoint.cs
- BitmapPalettes.cs
- CurrencyManager.cs
- GacUtil.cs
- PersonalizablePropertyEntry.cs
- SqlFlattener.cs
- UnauthorizedWebPart.cs
- HtmlContainerControl.cs
- InputScope.cs
- StringTraceRecord.cs
- ScrollViewerAutomationPeer.cs
- MessageQueue.cs
- ThreadStateException.cs
- RbTree.cs
- ServiceBuildProvider.cs
- CompatibleIComparer.cs
- TextEncodedRawTextWriter.cs
- DBSchemaRow.cs
- Select.cs
- WebDisplayNameAttribute.cs
- HttpWebRequest.cs
- TreeViewCancelEvent.cs
- PartitionedDataSource.cs
- DetailsViewUpdateEventArgs.cs
- TransformerTypeCollection.cs