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
- SoapCodeExporter.cs
- PerformanceCounterManager.cs
- MissingMemberException.cs
- SelectorAutomationPeer.cs
- CqlParser.cs
- ProcessInfo.cs
- TransactionManager.cs
- ScriptingProfileServiceSection.cs
- RelationshipWrapper.cs
- UICuesEvent.cs
- PersonalizationAdministration.cs
- CssTextWriter.cs
- MimeTypePropertyAttribute.cs
- RouteData.cs
- MailMessage.cs
- AsyncOperationContext.cs
- CollectionViewGroupRoot.cs
- SystemIPAddressInformation.cs
- XmlFormatExtensionPrefixAttribute.cs
- IpcClientManager.cs
- LogLogRecordHeader.cs
- HTTPNotFoundHandler.cs
- GlyphRunDrawing.cs
- HorizontalAlignConverter.cs
- EntryIndex.cs
- SqlUnionizer.cs
- ToolBar.cs
- XPathDocumentBuilder.cs
- XmlMembersMapping.cs
- UIElement3D.cs
- GeneralTransform3DGroup.cs
- ListItemCollection.cs
- RawKeyboardInputReport.cs
- PackWebRequestFactory.cs
- Journaling.cs
- CodeDirectionExpression.cs
- ArgumentElement.cs
- EntityViewContainer.cs
- EncodingInfo.cs
- AssociationSet.cs
- WebBrowserProgressChangedEventHandler.cs
- FtpRequestCacheValidator.cs
- BitmapEffectDrawingContextState.cs
- FieldValue.cs
- mda.cs
- ObjectRef.cs
- OleDbParameterCollection.cs
- IdentityReference.cs
- IndexerNameAttribute.cs
- ReadOnlyDataSource.cs
- HtmlInputFile.cs
- Roles.cs
- BindableTemplateBuilder.cs
- SplayTreeNode.cs
- AppDomain.cs
- BoundColumn.cs
- Column.cs
- RequestChannelBinder.cs
- ReceiveActivityDesigner.cs
- ConnectionStringsExpressionBuilder.cs
- AttributeAction.cs
- DataGridViewCheckBoxCell.cs
- HitTestResult.cs
- ReturnEventArgs.cs
- CachedFontFamily.cs
- AxWrapperGen.cs
- ZipIOZip64EndOfCentralDirectoryBlock.cs
- TimeStampChecker.cs
- ISFClipboardData.cs
- WaitForChangedResult.cs
- DataKey.cs
- DataService.cs
- SerializationFieldInfo.cs
- Geometry3D.cs
- Converter.cs
- DataList.cs
- GroupBoxDesigner.cs
- DataGridViewCellFormattingEventArgs.cs
- XPathNodeHelper.cs
- QueryStringParameter.cs
- NamedPermissionSet.cs
- LoadMessageLogger.cs
- SystemGatewayIPAddressInformation.cs
- HtmlControl.cs
- UnknownBitmapEncoder.cs
- CriticalFinalizerObject.cs
- NativeMethods.cs
- GridViewHeaderRowPresenter.cs
- PropertyToken.cs
- ScrollContentPresenter.cs
- DBParameter.cs
- CleanUpVirtualizedItemEventArgs.cs
- UserPreferenceChangedEventArgs.cs
- DesignSurface.cs
- StrokeSerializer.cs
- BrushMappingModeValidation.cs
- EntityDataSourceEntitySetNameItem.cs
- ZipArchive.cs
- HttpRequest.cs
- FixedBufferAttribute.cs