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
- XsltOutput.cs
- StreamReader.cs
- TableParagraph.cs
- RijndaelManaged.cs
- TypeBuilderInstantiation.cs
- CachedCompositeFamily.cs
- ManualResetEvent.cs
- ValidatedControlConverter.cs
- ActivationArguments.cs
- CryptoKeySecurity.cs
- RecommendedAsConfigurableAttribute.cs
- HttpValueCollection.cs
- HttpContext.cs
- IOThreadTimer.cs
- ManifestResourceInfo.cs
- WriteFileContext.cs
- PtsCache.cs
- FilterQuery.cs
- XmlHierarchicalEnumerable.cs
- ClrPerspective.cs
- HostingPreferredMapPath.cs
- InheritedPropertyDescriptor.cs
- TrustLevelCollection.cs
- PrintingPermissionAttribute.cs
- BinaryUtilClasses.cs
- WindowsAltTab.cs
- StringArrayConverter.cs
- SQLDateTimeStorage.cs
- ElementHostAutomationPeer.cs
- StylusButtonCollection.cs
- CompiledAction.cs
- CheckBoxBaseAdapter.cs
- RemotingConfiguration.cs
- StringDictionary.cs
- SafeHandles.cs
- UnknownWrapper.cs
- CodeGenerator.cs
- SourceItem.cs
- CreateParams.cs
- TraceListeners.cs
- MSAANativeProvider.cs
- SecurityKeyIdentifier.cs
- SponsorHelper.cs
- PipeStream.cs
- SqlDependencyUtils.cs
- XPathCompileException.cs
- TemplatePropertyEntry.cs
- SelectionWordBreaker.cs
- InternalsVisibleToAttribute.cs
- XslNumber.cs
- FilterEventArgs.cs
- ServicePointManagerElement.cs
- Accessible.cs
- QueryStack.cs
- ExtendedPropertyDescriptor.cs
- Knowncolors.cs
- XPathBuilder.cs
- ReferencedAssembly.cs
- ConfigXmlText.cs
- SoapReflectionImporter.cs
- SafeNativeMethods.cs
- DataConnectionHelper.cs
- ProfessionalColorTable.cs
- DataTemplateSelector.cs
- TimeManager.cs
- ActivityStatusChangeEventArgs.cs
- SecurityException.cs
- GradientSpreadMethodValidation.cs
- EncodingTable.cs
- WrapPanel.cs
- EncryptedKey.cs
- CodeTypeDeclaration.cs
- EDesignUtil.cs
- SecurityState.cs
- FilteredXmlReader.cs
- DataServiceConfiguration.cs
- XamlPointCollectionSerializer.cs
- ClientSettingsStore.cs
- MenuEventArgs.cs
- ApplySecurityAndSendAsyncResult.cs
- TypeBuilder.cs
- DesignerRegionMouseEventArgs.cs
- CultureInfoConverter.cs
- ObjRef.cs
- TemplateNameScope.cs
- Metafile.cs
- ZipFileInfoCollection.cs
- ExpressionPrefixAttribute.cs
- EntityDataReader.cs
- TransactionScopeDesigner.cs
- DataError.cs
- SplayTreeNode.cs
- TextClipboardData.cs
- ChtmlTextWriter.cs
- SQLDateTime.cs
- DiscoveryUtility.cs
- ClrProviderManifest.cs
- SecurityManager.cs
- PropertyIDSet.cs
- ViewBox.cs