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
- GlyphElement.cs
- GeneralTransform.cs
- M3DUtil.cs
- XmlName.cs
- Policy.cs
- _SafeNetHandles.cs
- TrackingServices.cs
- OperationInfo.cs
- CompModSwitches.cs
- PresentationTraceSources.cs
- SchemaObjectWriter.cs
- CompModHelpers.cs
- FilterQuery.cs
- ComponentManagerBroker.cs
- CustomCategoryAttribute.cs
- Processor.cs
- ScrollContentPresenter.cs
- CmsInterop.cs
- Point.cs
- PiiTraceSource.cs
- MetadataSource.cs
- CopyOnWriteList.cs
- MouseBinding.cs
- RadioButtonFlatAdapter.cs
- DataGridColumnHeaderAutomationPeer.cs
- Vector3DAnimation.cs
- MenuStrip.cs
- MDIWindowDialog.cs
- xml.cs
- ForceCopyBuildProvider.cs
- NetTcpSection.cs
- GcSettings.cs
- MatrixAnimationUsingKeyFrames.cs
- CacheSection.cs
- GlyphTypeface.cs
- ZoneMembershipCondition.cs
- ModuleBuilderData.cs
- PopupRootAutomationPeer.cs
- ElementProxy.cs
- Vector3DAnimation.cs
- XmlDigitalSignatureProcessor.cs
- Model3DGroup.cs
- DynamicPropertyHolder.cs
- CodeIdentifiers.cs
- XmlSchemaImport.cs
- Property.cs
- ProfilePropertyNameValidator.cs
- WebPartCancelEventArgs.cs
- EntityModelBuildProvider.cs
- DurableOperationAttribute.cs
- XPathNodeIterator.cs
- IItemProperties.cs
- ContentElement.cs
- RouteParameter.cs
- ConfigurationConverterBase.cs
- FunctionDefinition.cs
- DefaultAssemblyResolver.cs
- AlternationConverter.cs
- DayRenderEvent.cs
- SimpleExpression.cs
- TraceContextEventArgs.cs
- ConfigXmlCDataSection.cs
- EventListenerClientSide.cs
- PeerCollaborationPermission.cs
- DetailsViewModeEventArgs.cs
- TargetConverter.cs
- TransferRequestHandler.cs
- Configuration.cs
- Formatter.cs
- FilterQueryOptionExpression.cs
- ObjectCacheSettings.cs
- CloudCollection.cs
- Point3DConverter.cs
- controlskin.cs
- XMLSyntaxException.cs
- XmlSchemaNotation.cs
- ChildrenQuery.cs
- ComNativeDescriptor.cs
- ObjectDataSourceDisposingEventArgs.cs
- CommandTreeTypeHelper.cs
- AssemblyCache.cs
- Message.cs
- ValueExpressions.cs
- CustomValidator.cs
- SafeFileMapViewHandle.cs
- PerformanceCounterPermissionAttribute.cs
- SQlBooleanStorage.cs
- DispatchChannelSink.cs
- AttributeCollection.cs
- NotImplementedException.cs
- HtmlWindowCollection.cs
- Point3DIndependentAnimationStorage.cs
- PrivilegeNotHeldException.cs
- DataGridHeaderBorder.cs
- Vector3D.cs
- RequestQueue.cs
- StylusPointDescription.cs
- PageAdapter.cs
- SingleConverter.cs
- ManifestBasedResourceGroveler.cs