Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.Activities.DurableInstancing / System / Activities / DurableInstancing / SqlWorkflowInstanceStoreLock.cs / 1305376 / SqlWorkflowInstanceStoreLock.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.Activities.DurableInstancing { using System; using System.Collections.Generic; using System.Linq; using System.Runtime; using System.Runtime.DurableInstancing; using System.Threading; class SqlWorkflowInstanceStoreLock { bool isBeingModified; Guid lockOwnerId; SqlWorkflowInstanceStore sqlWorkflowInstanceStore; WeakReference lockOwnerInstanceHandle; object thisLock; public SqlWorkflowInstanceStoreLock(SqlWorkflowInstanceStore sqlWorkflowInstanceStore) { this.sqlWorkflowInstanceStore = sqlWorkflowInstanceStore; this.thisLock = new object(); this.SurrogateLockOwnerId = -1; } public PersistenceTask InstanceDetectionTask { get; set; } public bool IsValid { get { return IsLockOwnerValid(this.SurrogateLockOwnerId); } } public bool IsLockOwnerValid(long surrogateLockOwnerId) { return (this.SurrogateLockOwnerId != -1) && (surrogateLockOwnerId == this.SurrogateLockOwnerId) && (this.sqlWorkflowInstanceStore.InstanceOwnersExist); } public Guid LockOwnerId { get { return this.lockOwnerId; } } public PersistenceTask LockRecoveryTask { get; set; } public PersistenceTask LockRenewalTask { get; set; } public long SurrogateLockOwnerId { get; private set; } object ThisLock { get { return this.thisLock; } } public void MarkInstanceOwnerCreated(Guid lockOwnerId, long surrogateLockOwnerId, InstanceHandle lockOwnerInstanceHandle, bool detectRunnableInstances, bool detectActivatableInstances) { Fx.Assert(this.isBeingModified, "Must have modification lock to mark owner as created"); this.lockOwnerId = lockOwnerId; this.SurrogateLockOwnerId = surrogateLockOwnerId; this.lockOwnerInstanceHandle = new WeakReference(lockOwnerInstanceHandle); TimeSpan hostLockRenewalPeriod = this.sqlWorkflowInstanceStore.HostLockRenewalPeriod; TimeSpan runnableInstancesDetectionPeriod = this.sqlWorkflowInstanceStore.RunnableInstancesDetectionPeriod; if (detectActivatableInstances) { this.InstanceDetectionTask = new DetectActivatableWorkflowsTask(this.sqlWorkflowInstanceStore, this, runnableInstancesDetectionPeriod); } else if (detectRunnableInstances) { this.InstanceDetectionTask = new DetectRunnableInstancesTask(this.sqlWorkflowInstanceStore, this, runnableInstancesDetectionPeriod); } this.LockRenewalTask = new LockRenewalTask(this.sqlWorkflowInstanceStore, this, hostLockRenewalPeriod); this.LockRecoveryTask = new LockRecoveryTask(this.sqlWorkflowInstanceStore, this, hostLockRenewalPeriod); if (this.InstanceDetectionTask != null) { this.InstanceDetectionTask.ResetTimer(true); } this.LockRenewalTask.ResetTimer(true); this.LockRecoveryTask.ResetTimer(true); } public void MarkInstanceOwnerLost(long surrogateLockOwnerId, bool hasModificationLock) { if (hasModificationLock) { this.MarkInstanceOwnerLost(surrogateLockOwnerId); } else { this.TakeModificationLock(); this.MarkInstanceOwnerLost(surrogateLockOwnerId); this.ReturnModificationLock(); } } public void ReturnModificationLock() { Fx.Assert(this.isBeingModified, "Must have modification lock to release it!"); bool lockTaken = false; while (true) { Monitor.Enter(ThisLock, ref lockTaken); if (lockTaken) { this.isBeingModified = false; Monitor.Pulse(ThisLock); Monitor.Exit(ThisLock); return; } } } public void TakeModificationLock() { bool lockTaken = false; while (true) { Monitor.Enter(ThisLock, ref lockTaken); if (lockTaken) { while (this.isBeingModified) { Monitor.Wait(ThisLock); } this.isBeingModified = true; Monitor.Exit(ThisLock); return; } } } void MarkInstanceOwnerLost(long surrogateLockOwnerId) { Fx.Assert(this.isBeingModified, "Must have modification lock to mark owner as lost"); if (this.SurrogateLockOwnerId == surrogateLockOwnerId) { this.SurrogateLockOwnerId = -1; InstanceHandle instanceHandle = this.lockOwnerInstanceHandle.Target as InstanceHandle; if (instanceHandle != null) { instanceHandle.Free(); } if (this.sqlWorkflowInstanceStore.IsLockRetryEnabled()) { this.sqlWorkflowInstanceStore.LoadRetryHandler.AbortPendingRetries(); } if (this.LockRenewalTask != null) { this.LockRenewalTask.CancelTimer(); } if (this.LockRecoveryTask != null) { this.LockRecoveryTask.CancelTimer(); } if (this.InstanceDetectionTask != null) { this.InstanceDetectionTask.CancelTimer(); } } } } } // 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
- SystemGatewayIPAddressInformation.cs
- SqlComparer.cs
- CommandEventArgs.cs
- GridItemCollection.cs
- MeasureData.cs
- InfoCardKeyedHashAlgorithm.cs
- EntityDataSourceMemberPath.cs
- PolygonHotSpot.cs
- RectAnimationBase.cs
- AssemblyFilter.cs
- PropertyManager.cs
- SchemaSetCompiler.cs
- TextEndOfSegment.cs
- RequestCacheValidator.cs
- Animatable.cs
- Lease.cs
- PasswordDeriveBytes.cs
- _ListenerRequestStream.cs
- SerializerProvider.cs
- UpdateEventArgs.cs
- SqlClientFactory.cs
- XmlToDatasetMap.cs
- InfoCardProofToken.cs
- XmlSchemaObjectTable.cs
- VariableQuery.cs
- DynamicRendererThreadManager.cs
- ConnectionManagementSection.cs
- CmsInterop.cs
- ValidatingReaderNodeData.cs
- PersonalizableAttribute.cs
- ScrollItemPattern.cs
- ParameterCollection.cs
- SmiContextFactory.cs
- ProtocolsConfiguration.cs
- GetIndexBinder.cs
- PropertyValue.cs
- LayoutEngine.cs
- NopReturnReader.cs
- mediaeventargs.cs
- PixelFormat.cs
- ReferencedType.cs
- ThemeableAttribute.cs
- XmlLinkedNode.cs
- PowerEase.cs
- ProxyHwnd.cs
- Configuration.cs
- FixedSOMElement.cs
- WebPartConnectVerb.cs
- CompilerInfo.cs
- ApplicationFileCodeDomTreeGenerator.cs
- HitTestParameters3D.cs
- EnumerableCollectionView.cs
- CompoundFileStorageReference.cs
- Compiler.cs
- LocalValueEnumerator.cs
- DependencyPropertyKey.cs
- GenericIdentity.cs
- _TransmitFileOverlappedAsyncResult.cs
- PlatformCulture.cs
- TdsParserSessionPool.cs
- Image.cs
- WhiteSpaceTrimStringConverter.cs
- HTTP_SERVICE_CONFIG_URLACL_PARAM.cs
- StylusSystemGestureEventArgs.cs
- ObjectKeyFrameCollection.cs
- XmlSchemaInferenceException.cs
- InvalidBodyAccessException.cs
- MultiBindingExpression.cs
- RectAnimationUsingKeyFrames.cs
- ScriptManager.cs
- InvokeBinder.cs
- RectValueSerializer.cs
- WorkflowMarkupSerializationException.cs
- OneWayBindingElement.cs
- SessionStateModule.cs
- WebDisplayNameAttribute.cs
- DateTimeConverter2.cs
- CreateUserWizard.cs
- EventLogPermissionEntry.cs
- DataGridViewImageCell.cs
- MetabaseSettings.cs
- KeyValueInternalCollection.cs
- BrushValueSerializer.cs
- SchemaObjectWriter.cs
- AppLevelCompilationSectionCache.cs
- IssuedTokenClientElement.cs
- XmlDeclaration.cs
- WinFormsSecurity.cs
- Point.cs
- TextEvent.cs
- HttpPostedFileWrapper.cs
- LabelLiteral.cs
- ObjectDataSourceEventArgs.cs
- ValueExpressions.cs
- ParallelLoopState.cs
- SpecialFolderEnumConverter.cs
- Oci.cs
- safelink.cs
- ContactManager.cs
- SmiEventSink_Default.cs