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
- Storyboard.cs
- NavigationService.cs
- CompensatableTransactionScopeActivityDesigner.cs
- ClientSideQueueItem.cs
- _CookieModule.cs
- Metafile.cs
- SspiSafeHandles.cs
- BitmapVisualManager.cs
- SerialReceived.cs
- XmlBoundElement.cs
- DataViewListener.cs
- DataGridViewRowsAddedEventArgs.cs
- VoiceChangeEventArgs.cs
- TcpSocketManager.cs
- LineSegment.cs
- SiteMapNodeItem.cs
- Table.cs
- MultilineStringConverter.cs
- EditorZone.cs
- ManipulationCompletedEventArgs.cs
- ControlValuePropertyAttribute.cs
- Native.cs
- OptimalTextSource.cs
- BreadCrumbTextConverter.cs
- PkcsUtils.cs
- ControlBindingsCollection.cs
- HttpCacheVary.cs
- GenericPrincipal.cs
- SerialErrors.cs
- FindCriteriaElement.cs
- WebErrorHandler.cs
- hresults.cs
- InputBuffer.cs
- SiteMapSection.cs
- StorageTypeMapping.cs
- BitmapCodecInfoInternal.cs
- ServiceEndpointElement.cs
- SecurityCredentialsManager.cs
- LinqDataSourceHelper.cs
- NavigatingCancelEventArgs.cs
- ProfileProvider.cs
- TextEffect.cs
- DataContractSet.cs
- CompilerTypeWithParams.cs
- ObjectFactoryCodeDomTreeGenerator.cs
- XmlSerializer.cs
- Highlights.cs
- CodeMemberEvent.cs
- DataGridViewCheckBoxCell.cs
- EncoderReplacementFallback.cs
- _BasicClient.cs
- FlowSwitch.cs
- TreeNodeStyle.cs
- FormViewUpdateEventArgs.cs
- KeyValuePair.cs
- TreeViewEvent.cs
- FontWeight.cs
- CommunicationObject.cs
- WindowsListViewItem.cs
- BindingsCollection.cs
- Matrix.cs
- XmlCompatibilityReader.cs
- input.cs
- SqlXml.cs
- GC.cs
- HttpServerVarsCollection.cs
- ManagementObjectSearcher.cs
- ImageAnimator.cs
- SelectorAutomationPeer.cs
- ImageMap.cs
- WindowsIdentity.cs
- DrawingAttributeSerializer.cs
- UnsafeNetInfoNativeMethods.cs
- ProvideValueServiceProvider.cs
- QuaternionConverter.cs
- TextEffectCollection.cs
- ToolStripMenuItem.cs
- _ChunkParse.cs
- PropVariant.cs
- BooleanFacetDescriptionElement.cs
- CacheRequest.cs
- Stackframe.cs
- MetadataItemCollectionFactory.cs
- BooleanFunctions.cs
- DesignerActionUI.cs
- EmbeddedMailObject.cs
- ExtendedProtectionPolicy.cs
- _ShellExpression.cs
- SerialErrors.cs
- HtmlInputHidden.cs
- ObjectViewListener.cs
- SendAgentStatusRequest.cs
- ZipIOExtraField.cs
- WrapPanel.cs
- LocatorGroup.cs
- ScriptReferenceEventArgs.cs
- XmlComplianceUtil.cs
- XPathParser.cs
- SessionEndedEventArgs.cs
- PublisherMembershipCondition.cs