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
- IsolatedStorageFileStream.cs
- ManagementOptions.cs
- SoapAttributes.cs
- OperationAbortedException.cs
- RectangleConverter.cs
- XmlSchemaSubstitutionGroup.cs
- DetailsViewRowCollection.cs
- FormatSettings.cs
- RewritingPass.cs
- ProcessProtocolHandler.cs
- TextTreeTextBlock.cs
- ScrollChrome.cs
- SHA1.cs
- ActivityCodeDomSerializationManager.cs
- DbXmlEnabledProviderManifest.cs
- AttachmentCollection.cs
- DataGridViewButtonCell.cs
- _CacheStreams.cs
- ConfigXmlWhitespace.cs
- PageCodeDomTreeGenerator.cs
- FieldAccessException.cs
- XPathBinder.cs
- ISessionStateStore.cs
- MetricEntry.cs
- PermissionListSet.cs
- AccessedThroughPropertyAttribute.cs
- MatchAllMessageFilter.cs
- ButtonStandardAdapter.cs
- Stroke.cs
- OuterGlowBitmapEffect.cs
- GeometryCombineModeValidation.cs
- DataGridViewSelectedColumnCollection.cs
- ExceptionValidationRule.cs
- CorrelationScope.cs
- HtmlControlPersistable.cs
- BuiltInExpr.cs
- MaskedTextProvider.cs
- DialogResultConverter.cs
- RenderingBiasValidation.cs
- ColumnClickEvent.cs
- HashCodeCombiner.cs
- CommandValueSerializer.cs
- NativeMethods.cs
- SplitterEvent.cs
- TextTrailingWordEllipsis.cs
- RadioButtonRenderer.cs
- LicenseContext.cs
- CompilerGeneratedAttribute.cs
- ExceptionList.cs
- UnionExpr.cs
- MergePropertyDescriptor.cs
- ObjRef.cs
- CapabilitiesRule.cs
- RegistryKey.cs
- ScriptReferenceBase.cs
- ConstructorBuilder.cs
- NavigationWindow.cs
- DateTimeOffset.cs
- CodeBinaryOperatorExpression.cs
- Journaling.cs
- _RequestCacheProtocol.cs
- ChannelServices.cs
- DynamicPhysicalDiscoSearcher.cs
- CodeDOMUtility.cs
- Comparer.cs
- PeerCollaborationPermission.cs
- HyperlinkAutomationPeer.cs
- MediaTimeline.cs
- OrderedHashRepartitionStream.cs
- mil_commands.cs
- MethodBuilderInstantiation.cs
- BindingExpression.cs
- ApplicationContext.cs
- DesignerCapabilities.cs
- SqlWebEventProvider.cs
- WinFormsUtils.cs
- LocalizableResourceBuilder.cs
- MsmqDecodeHelper.cs
- Matrix3DValueSerializer.cs
- RoleServiceManager.cs
- EmptyQuery.cs
- _OSSOCK.cs
- SevenBitStream.cs
- SessionIDManager.cs
- WebWorkflowRole.cs
- BitmapInitialize.cs
- ChangePassword.cs
- CategoryGridEntry.cs
- ObjectIDGenerator.cs
- FlowSwitchLink.cs
- XmlCodeExporter.cs
- SecUtil.cs
- SendingRequestEventArgs.cs
- GrammarBuilderBase.cs
- TextRangeEditLists.cs
- MultiSelectRootGridEntry.cs
- StringUtil.cs
- UnaryExpression.cs
- WsdlHelpGeneratorElement.cs
- TreeNodeStyleCollectionEditor.cs