Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / System.Runtime.DurableInstancing / System / Runtime / DurableInstancing / InstanceView.cs / 1305376 / InstanceView.cs
//---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //--------------------------------------------------------------- namespace System.Runtime.DurableInstancing { using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics.CodeAnalysis; using System.Runtime; using System.Xml.Linq; using System.Threading; [Fx.Tag.XamlVisible(false)] public sealed class InstanceView { static readonly ReadOnlyDictionaryemptyProperties = new ReadOnlyDictionary (new Dictionary (0), false); static readonly ReadOnlyDictionary emptyKeys = new ReadOnlyDictionary (new Dictionary (0), false); IDictionary data; IDictionary metadata; IDictionary ownerMetadata; IDictionary keys; ReadOnlyCollection queryResults; Dictionary accumulatedMetadataWrites; Dictionary accumulatedOwnerMetadataWrites; Collection queryResultsBackingCollection; long instanceVersion; internal InstanceView(InstanceOwner owner) : this() { InstanceOwner = owner; } internal InstanceView(InstanceOwner owner, Guid instanceId) : this() { Fx.Assert(instanceId != Guid.Empty, "Null instanceId passed to InstanceView ctor."); InstanceOwner = owner; InstanceId = instanceId; IsBoundToInstance = true; } InstanceView() { this.instanceVersion = -1; InstanceDataConsistency = InstanceValueConsistency.InDoubt | InstanceValueConsistency.Partial; InstanceMetadataConsistency = InstanceValueConsistency.InDoubt | InstanceValueConsistency.Partial; InstanceOwnerMetadataConsistency = InstanceValueConsistency.InDoubt | InstanceValueConsistency.Partial; InstanceKeysConsistency = InstanceValueConsistency.InDoubt | InstanceValueConsistency.Partial; } InstanceView(InstanceView source) { this.instanceVersion = source.instanceVersion; InstanceOwner = source.InstanceOwner; InstanceId = source.InstanceId; IsBoundToInstance = source.IsBoundToInstance; InstanceState = source.InstanceState; InstanceDataConsistency = source.InstanceDataConsistency; InstanceMetadataConsistency = source.InstanceMetadataConsistency; InstanceOwnerMetadataConsistency = source.InstanceOwnerMetadataConsistency; InstanceKeysConsistency = source.InstanceKeysConsistency; InstanceData = source.InstanceData; InstanceMetadata = source.InstanceMetadata; InstanceOwnerMetadata = source.InstanceOwnerMetadata; InstanceStoreQueryResults = source.InstanceStoreQueryResults; Dictionary keys = null; if (source.InstanceKeys.Count > 0) { keys = new Dictionary (source.InstanceKeys.Count); foreach (KeyValuePair key in source.InstanceKeys) { keys.Add(key.Key, key.Value.Clone()); } } InstanceKeys = keys == null ? null : new ReadOnlyDictionary (keys, false); } public Guid InstanceId { get; private set; } public bool IsBoundToInstance { get; private set; } public InstanceOwner InstanceOwner { get; private set; } public bool IsBoundToInstanceOwner { get { return InstanceOwner != null; } } public bool IsBoundToLock { get { return this.instanceVersion >= 0; } } public InstanceState InstanceState { get; internal set; } // All dictionaries are always read-only. public InstanceValueConsistency InstanceDataConsistency { get; internal set; } public IDictionary InstanceData { get { return this.data ?? InstanceView.emptyProperties; } internal set { Fx.AssertAndThrow(!IsViewFrozen, "Setting Data on frozen View."); this.data = value; } } public InstanceValueConsistency InstanceMetadataConsistency { get; internal set; } public IDictionary InstanceMetadata { get { IDictionary pendingWrites = this.accumulatedMetadataWrites; this.accumulatedMetadataWrites = null; this.metadata = pendingWrites.ReadOnlyMergeInto(this.metadata ?? InstanceView.emptyProperties, true); return this.metadata; } internal set { Fx.AssertAndThrow(!IsViewFrozen, "Setting Metadata on frozen View."); this.accumulatedMetadataWrites = null; this.metadata = value; } } internal Dictionary AccumulatedMetadataWrites { get { if (this.accumulatedMetadataWrites == null) { this.accumulatedMetadataWrites = new Dictionary (); } return this.accumulatedMetadataWrites; } } public InstanceValueConsistency InstanceOwnerMetadataConsistency { get; internal set; } public IDictionary InstanceOwnerMetadata { get { IDictionary pendingWrites = this.accumulatedOwnerMetadataWrites; this.accumulatedOwnerMetadataWrites = null; this.ownerMetadata = pendingWrites.ReadOnlyMergeInto(this.ownerMetadata ?? InstanceView.emptyProperties, true); return this.ownerMetadata; } internal set { Fx.AssertAndThrow(!IsViewFrozen, "Setting OwnerMetadata on frozen View."); this.accumulatedOwnerMetadataWrites = null; this.ownerMetadata = value; } } internal Dictionary AccumulatedOwnerMetadataWrites { get { if (this.accumulatedOwnerMetadataWrites == null) { this.accumulatedOwnerMetadataWrites = new Dictionary (); } return this.accumulatedOwnerMetadataWrites; } } public InstanceValueConsistency InstanceKeysConsistency { get; internal set; } public IDictionary InstanceKeys { get { return this.keys ?? InstanceView.emptyKeys; } internal set { Fx.AssertAndThrow(!IsViewFrozen, "Setting Keys on frozen View."); this.keys = value; } } // Arch prefers ReadOnlyCollection here to ICollection. [SuppressMessage(FxCop.Category.Usage, FxCop.Rule.CollectionPropertiesShouldBeReadOnly, Justification = "property is of ReadOnlyCollection type")] public ReadOnlyCollection InstanceStoreQueryResults { get { if (this.queryResults == null) { this.queryResults = new ReadOnlyCollection (QueryResultsBacking); } return this.queryResults; } internal set { Fx.AssertAndThrow(!IsViewFrozen, "Setting InstanceStoreQueryResults on frozen View."); this.queryResults = null; if (value == null) { this.queryResultsBackingCollection = null; } else { this.queryResultsBackingCollection = new Collection (); foreach (InstanceStoreQueryResult queryResult in value) { this.queryResultsBackingCollection.Add(queryResult); } } } } internal Collection QueryResultsBacking { get { if (this.queryResultsBackingCollection == null) { this.queryResultsBackingCollection = new Collection (); } return this.queryResultsBackingCollection; } } internal void BindOwner(InstanceOwner owner) { Fx.AssertAndThrow(!IsViewFrozen, "BindOwner called on read-only InstanceView."); Fx.Assert(owner != null, "Null owner passed to BindOwner."); if (IsBoundToInstanceOwner) { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.ContextAlreadyBoundToOwner)); } InstanceOwner = owner; } internal void BindInstance(Guid instanceId) { Fx.AssertAndThrow(!IsViewFrozen, "BindInstance called on read-only InstanceView."); Fx.Assert(instanceId != Guid.Empty, "Null instanceId passed to BindInstance."); if (IsBoundToInstance) { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.ContextAlreadyBoundToInstance)); } InstanceId = instanceId; IsBoundToInstance = true; } internal void BindLock(long instanceVersion) { Fx.AssertAndThrow(!IsViewFrozen, "BindLock called on read-only InstanceView."); Fx.Assert(instanceVersion >= 0, "Negative instanceVersion passed to BindLock."); if (!IsBoundToInstanceOwner) { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.ContextMustBeBoundToOwner)); } if (!IsBoundToInstance) { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.ContextMustBeBoundToInstance)); } if (Interlocked.CompareExchange(ref this.instanceVersion, instanceVersion, -1) != -1) { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.ContextAlreadyBoundToLock)); } } // This method is called when IPC.BindReclaimedLock is called. It reserves the lock, so that future calls to this or BindLock can be prevented. // We set the version to -(instanceVersion + 2) so that 0 maps to -2 (since -1 is special). internal void StartBindLock(long instanceVersion) { Fx.AssertAndThrow(!IsViewFrozen, "StartBindLock called on read-only InstanceView."); Fx.Assert(instanceVersion >= 0, "Negative instanceVersion passed to StartBindLock."); if (!IsBoundToInstanceOwner) { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.ContextMustBeBoundToOwner)); } if (!IsBoundToInstance) { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.ContextMustBeBoundToInstance)); } if (Interlocked.CompareExchange(ref this.instanceVersion, checked(-instanceVersion - 2), -1) != -1) { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.ContextAlreadyBoundToLock)); } } // This completes the bind started in StartBindLock. internal void FinishBindLock(long instanceVersion) { Fx.AssertAndThrow(!IsViewFrozen, "FinishBindLock called on read-only InstanceView."); Fx.Assert(IsBoundToInstanceOwner, "Must be bound to owner, checked in StartBindLock."); Fx.Assert(IsBoundToInstance, "Must be bound to instance, checked in StartBindLock."); long result = Interlocked.CompareExchange(ref this.instanceVersion, instanceVersion, -instanceVersion - 2); Fx.AssertAndThrow(result == -instanceVersion - 2, "FinishBindLock called with mismatched instance version."); } internal void MakeReadOnly() { IsViewFrozen = true; } internal InstanceView Clone() { return new InstanceView(this); } bool IsViewFrozen { get; set; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //--------------------------------------------------------------- namespace System.Runtime.DurableInstancing { using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics.CodeAnalysis; using System.Runtime; using System.Xml.Linq; using System.Threading; [Fx.Tag.XamlVisible(false)] public sealed class InstanceView { static readonly ReadOnlyDictionary emptyProperties = new ReadOnlyDictionary (new Dictionary (0), false); static readonly ReadOnlyDictionary emptyKeys = new ReadOnlyDictionary (new Dictionary (0), false); IDictionary data; IDictionary metadata; IDictionary ownerMetadata; IDictionary keys; ReadOnlyCollection queryResults; Dictionary accumulatedMetadataWrites; Dictionary accumulatedOwnerMetadataWrites; Collection queryResultsBackingCollection; long instanceVersion; internal InstanceView(InstanceOwner owner) : this() { InstanceOwner = owner; } internal InstanceView(InstanceOwner owner, Guid instanceId) : this() { Fx.Assert(instanceId != Guid.Empty, "Null instanceId passed to InstanceView ctor."); InstanceOwner = owner; InstanceId = instanceId; IsBoundToInstance = true; } InstanceView() { this.instanceVersion = -1; InstanceDataConsistency = InstanceValueConsistency.InDoubt | InstanceValueConsistency.Partial; InstanceMetadataConsistency = InstanceValueConsistency.InDoubt | InstanceValueConsistency.Partial; InstanceOwnerMetadataConsistency = InstanceValueConsistency.InDoubt | InstanceValueConsistency.Partial; InstanceKeysConsistency = InstanceValueConsistency.InDoubt | InstanceValueConsistency.Partial; } InstanceView(InstanceView source) { this.instanceVersion = source.instanceVersion; InstanceOwner = source.InstanceOwner; InstanceId = source.InstanceId; IsBoundToInstance = source.IsBoundToInstance; InstanceState = source.InstanceState; InstanceDataConsistency = source.InstanceDataConsistency; InstanceMetadataConsistency = source.InstanceMetadataConsistency; InstanceOwnerMetadataConsistency = source.InstanceOwnerMetadataConsistency; InstanceKeysConsistency = source.InstanceKeysConsistency; InstanceData = source.InstanceData; InstanceMetadata = source.InstanceMetadata; InstanceOwnerMetadata = source.InstanceOwnerMetadata; InstanceStoreQueryResults = source.InstanceStoreQueryResults; Dictionary keys = null; if (source.InstanceKeys.Count > 0) { keys = new Dictionary (source.InstanceKeys.Count); foreach (KeyValuePair key in source.InstanceKeys) { keys.Add(key.Key, key.Value.Clone()); } } InstanceKeys = keys == null ? null : new ReadOnlyDictionary (keys, false); } public Guid InstanceId { get; private set; } public bool IsBoundToInstance { get; private set; } public InstanceOwner InstanceOwner { get; private set; } public bool IsBoundToInstanceOwner { get { return InstanceOwner != null; } } public bool IsBoundToLock { get { return this.instanceVersion >= 0; } } public InstanceState InstanceState { get; internal set; } // All dictionaries are always read-only. public InstanceValueConsistency InstanceDataConsistency { get; internal set; } public IDictionary InstanceData { get { return this.data ?? InstanceView.emptyProperties; } internal set { Fx.AssertAndThrow(!IsViewFrozen, "Setting Data on frozen View."); this.data = value; } } public InstanceValueConsistency InstanceMetadataConsistency { get; internal set; } public IDictionary InstanceMetadata { get { IDictionary pendingWrites = this.accumulatedMetadataWrites; this.accumulatedMetadataWrites = null; this.metadata = pendingWrites.ReadOnlyMergeInto(this.metadata ?? InstanceView.emptyProperties, true); return this.metadata; } internal set { Fx.AssertAndThrow(!IsViewFrozen, "Setting Metadata on frozen View."); this.accumulatedMetadataWrites = null; this.metadata = value; } } internal Dictionary AccumulatedMetadataWrites { get { if (this.accumulatedMetadataWrites == null) { this.accumulatedMetadataWrites = new Dictionary (); } return this.accumulatedMetadataWrites; } } public InstanceValueConsistency InstanceOwnerMetadataConsistency { get; internal set; } public IDictionary InstanceOwnerMetadata { get { IDictionary pendingWrites = this.accumulatedOwnerMetadataWrites; this.accumulatedOwnerMetadataWrites = null; this.ownerMetadata = pendingWrites.ReadOnlyMergeInto(this.ownerMetadata ?? InstanceView.emptyProperties, true); return this.ownerMetadata; } internal set { Fx.AssertAndThrow(!IsViewFrozen, "Setting OwnerMetadata on frozen View."); this.accumulatedOwnerMetadataWrites = null; this.ownerMetadata = value; } } internal Dictionary AccumulatedOwnerMetadataWrites { get { if (this.accumulatedOwnerMetadataWrites == null) { this.accumulatedOwnerMetadataWrites = new Dictionary (); } return this.accumulatedOwnerMetadataWrites; } } public InstanceValueConsistency InstanceKeysConsistency { get; internal set; } public IDictionary InstanceKeys { get { return this.keys ?? InstanceView.emptyKeys; } internal set { Fx.AssertAndThrow(!IsViewFrozen, "Setting Keys on frozen View."); this.keys = value; } } // Arch prefers ReadOnlyCollection here to ICollection. [SuppressMessage(FxCop.Category.Usage, FxCop.Rule.CollectionPropertiesShouldBeReadOnly, Justification = "property is of ReadOnlyCollection type")] public ReadOnlyCollection InstanceStoreQueryResults { get { if (this.queryResults == null) { this.queryResults = new ReadOnlyCollection (QueryResultsBacking); } return this.queryResults; } internal set { Fx.AssertAndThrow(!IsViewFrozen, "Setting InstanceStoreQueryResults on frozen View."); this.queryResults = null; if (value == null) { this.queryResultsBackingCollection = null; } else { this.queryResultsBackingCollection = new Collection (); foreach (InstanceStoreQueryResult queryResult in value) { this.queryResultsBackingCollection.Add(queryResult); } } } } internal Collection QueryResultsBacking { get { if (this.queryResultsBackingCollection == null) { this.queryResultsBackingCollection = new Collection (); } return this.queryResultsBackingCollection; } } internal void BindOwner(InstanceOwner owner) { Fx.AssertAndThrow(!IsViewFrozen, "BindOwner called on read-only InstanceView."); Fx.Assert(owner != null, "Null owner passed to BindOwner."); if (IsBoundToInstanceOwner) { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.ContextAlreadyBoundToOwner)); } InstanceOwner = owner; } internal void BindInstance(Guid instanceId) { Fx.AssertAndThrow(!IsViewFrozen, "BindInstance called on read-only InstanceView."); Fx.Assert(instanceId != Guid.Empty, "Null instanceId passed to BindInstance."); if (IsBoundToInstance) { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.ContextAlreadyBoundToInstance)); } InstanceId = instanceId; IsBoundToInstance = true; } internal void BindLock(long instanceVersion) { Fx.AssertAndThrow(!IsViewFrozen, "BindLock called on read-only InstanceView."); Fx.Assert(instanceVersion >= 0, "Negative instanceVersion passed to BindLock."); if (!IsBoundToInstanceOwner) { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.ContextMustBeBoundToOwner)); } if (!IsBoundToInstance) { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.ContextMustBeBoundToInstance)); } if (Interlocked.CompareExchange(ref this.instanceVersion, instanceVersion, -1) != -1) { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.ContextAlreadyBoundToLock)); } } // This method is called when IPC.BindReclaimedLock is called. It reserves the lock, so that future calls to this or BindLock can be prevented. // We set the version to -(instanceVersion + 2) so that 0 maps to -2 (since -1 is special). internal void StartBindLock(long instanceVersion) { Fx.AssertAndThrow(!IsViewFrozen, "StartBindLock called on read-only InstanceView."); Fx.Assert(instanceVersion >= 0, "Negative instanceVersion passed to StartBindLock."); if (!IsBoundToInstanceOwner) { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.ContextMustBeBoundToOwner)); } if (!IsBoundToInstance) { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.ContextMustBeBoundToInstance)); } if (Interlocked.CompareExchange(ref this.instanceVersion, checked(-instanceVersion - 2), -1) != -1) { throw Fx.Exception.AsError(new InvalidOperationException(SRCore.ContextAlreadyBoundToLock)); } } // This completes the bind started in StartBindLock. internal void FinishBindLock(long instanceVersion) { Fx.AssertAndThrow(!IsViewFrozen, "FinishBindLock called on read-only InstanceView."); Fx.Assert(IsBoundToInstanceOwner, "Must be bound to owner, checked in StartBindLock."); Fx.Assert(IsBoundToInstance, "Must be bound to instance, checked in StartBindLock."); long result = Interlocked.CompareExchange(ref this.instanceVersion, instanceVersion, -instanceVersion - 2); Fx.AssertAndThrow(result == -instanceVersion - 2, "FinishBindLock called with mismatched instance version."); } internal void MakeReadOnly() { IsViewFrozen = true; } internal InstanceView Clone() { return new InstanceView(this); } bool IsViewFrozen { get; set; } } } // 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
- SpellerInterop.cs
- BasePattern.cs
- LayoutInformation.cs
- TypeConverterBase.cs
- Control.cs
- DataViewSettingCollection.cs
- BindingCollection.cs
- SqlRetyper.cs
- SessionChannels.cs
- ToolConsole.cs
- BufferedReadStream.cs
- _IPv4Address.cs
- ServiceBusyException.cs
- DashStyle.cs
- SerializationObjectManager.cs
- ForeignKeyConstraint.cs
- PerspectiveCamera.cs
- ComNativeDescriptor.cs
- ConfigurationException.cs
- XmlComment.cs
- SoapParser.cs
- WebConfigurationHost.cs
- TemplateControlCodeDomTreeGenerator.cs
- TouchFrameEventArgs.cs
- QilTypeChecker.cs
- RectangleConverter.cs
- DiscoveryReference.cs
- TextEncodedRawTextWriter.cs
- HostedImpersonationContext.cs
- RouteUrlExpressionBuilder.cs
- DataGridViewColumnStateChangedEventArgs.cs
- TrustManagerMoreInformation.cs
- WindowVisualStateTracker.cs
- Random.cs
- HttpContextBase.cs
- UpdateDelegates.Generated.cs
- Effect.cs
- InfoCardSymmetricAlgorithm.cs
- AttributedMetaModel.cs
- SrgsText.cs
- ObjectStorage.cs
- RemoteWebConfigurationHostServer.cs
- WindowsTitleBar.cs
- StateMachineSubscriptionManager.cs
- TableLayoutStyle.cs
- WindowsGraphicsWrapper.cs
- MultipartContentParser.cs
- DesignSurfaceManager.cs
- TextCompositionEventArgs.cs
- DateTimeUtil.cs
- OleDbException.cs
- TypeUsageBuilder.cs
- SystemIcmpV6Statistics.cs
- SectionXmlInfo.cs
- AssemblyResourceLoader.cs
- MsdtcClusterUtils.cs
- CompilationRelaxations.cs
- RangeValidator.cs
- InvokeSchedule.cs
- CornerRadius.cs
- SqlRowUpdatedEvent.cs
- SkipStoryboardToFill.cs
- UpdateExpressionVisitor.cs
- VBCodeProvider.cs
- UpdatableWrapper.cs
- DigitShape.cs
- ContentDisposition.cs
- BezierSegment.cs
- WSDualHttpSecurity.cs
- GetWinFXPath.cs
- SolidColorBrush.cs
- GlyphRunDrawing.cs
- BuildResultCache.cs
- InkPresenter.cs
- WasAdminWrapper.cs
- CodeObject.cs
- filewebresponse.cs
- UdpAnnouncementEndpoint.cs
- ListCollectionView.cs
- FrameworkTextComposition.cs
- ImpersonateTokenRef.cs
- TaskFormBase.cs
- ScaleTransform.cs
- Evidence.cs
- BufferAllocator.cs
- PersistChildrenAttribute.cs
- SemaphoreSecurity.cs
- LingerOption.cs
- BuildDependencySet.cs
- ProjectionPruner.cs
- RadioButton.cs
- ASCIIEncoding.cs
- ColumnBinding.cs
- DocumentGridPage.cs
- ExtensionWindow.cs
- Rect3DConverter.cs
- Rijndael.cs
- CornerRadius.cs
- NodeLabelEditEvent.cs
- EdmComplexTypeAttribute.cs