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
- SqlUDTStorage.cs
- Models.cs
- HyperLink.cs
- FixedSOMTable.cs
- WebResourceAttribute.cs
- BinaryFormatter.cs
- ObjectStorage.cs
- DynamicEntity.cs
- MessageOperationFormatter.cs
- StrongNameUtility.cs
- WSIdentityFaultException.cs
- MessageDesigner.cs
- Logging.cs
- ItemContainerGenerator.cs
- WSDualHttpSecurityElement.cs
- TextPointer.cs
- DesignerPerfEventProvider.cs
- CodeGenerator.cs
- ErrorTableItemStyle.cs
- ResumeStoryboard.cs
- XmlReflectionMember.cs
- MasterPageCodeDomTreeGenerator.cs
- Win32.cs
- NavigationProgressEventArgs.cs
- FormatterConverter.cs
- Array.cs
- LassoHelper.cs
- RepeatBehavior.cs
- log.cs
- RenderContext.cs
- SelectionEditingBehavior.cs
- Point3DAnimation.cs
- PageHandlerFactory.cs
- TextParagraph.cs
- CodeCommentStatement.cs
- WorkerRequest.cs
- TextElementAutomationPeer.cs
- SecurityCriticalDataForSet.cs
- ResourceWriter.cs
- EnterpriseServicesHelper.cs
- WebEncodingValidatorAttribute.cs
- WrappedReader.cs
- WindowsFont.cs
- ForEachAction.cs
- Documentation.cs
- RegexCode.cs
- AccessDataSourceView.cs
- AsyncInvokeOperation.cs
- RequestCachePolicy.cs
- SortableBindingList.cs
- DataSourceHelper.cs
- OpacityConverter.cs
- Set.cs
- ObjectDataSourceMethodEventArgs.cs
- PasswordPropertyTextAttribute.cs
- SpanIndex.cs
- RuleInfoComparer.cs
- CodeTypeMemberCollection.cs
- OrderedDictionary.cs
- HttpStreams.cs
- InkCanvasSelection.cs
- DbMetaDataColumnNames.cs
- ElementHostAutomationPeer.cs
- ParamArrayAttribute.cs
- WebPartConnectionsConfigureVerb.cs
- DataGridPageChangedEventArgs.cs
- ContentDisposition.cs
- WebServiceParameterData.cs
- DateTime.cs
- FolderLevelBuildProvider.cs
- ConversionValidationRule.cs
- MouseEventArgs.cs
- KeyValueConfigurationCollection.cs
- XmlTypeAttribute.cs
- HttpListenerContext.cs
- MemberRestriction.cs
- OperationFormatter.cs
- TypeDescriptor.cs
- PasswordPropertyTextAttribute.cs
- CommentEmitter.cs
- XmlSchemaElement.cs
- WebPartZone.cs
- WorkflowService.cs
- WebPartConnectionsConfigureVerb.cs
- AttachedPropertiesService.cs
- ActiveXHelper.cs
- FlowDocumentPaginator.cs
- SiteMapNodeItemEventArgs.cs
- PerformanceCounterPermissionEntry.cs
- DetailsView.cs
- AttributeQuery.cs
- GregorianCalendar.cs
- PropertyDescriptorGridEntry.cs
- UnauthorizedWebPart.cs
- ResolveNameEventArgs.cs
- _NTAuthentication.cs
- MSHTMLHost.cs
- FileAuthorizationModule.cs
- JournalEntryListConverter.cs
- PasswordPropertyTextAttribute.cs