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
- SQlBooleanStorage.cs
- DirectoryNotFoundException.cs
- RuntimeUtils.cs
- EasingFunctionBase.cs
- XmlNodeChangedEventManager.cs
- ParagraphResult.cs
- BaseUriHelper.cs
- ForceCopyBuildProvider.cs
- PersonalizableAttribute.cs
- TextServicesPropertyRanges.cs
- EntityFunctions.cs
- WebServiceErrorEvent.cs
- TemplateColumn.cs
- DataGridViewComboBoxCell.cs
- ConversionContext.cs
- URI.cs
- RadioButton.cs
- CollectionConverter.cs
- TemplateContent.cs
- TypedTableBaseExtensions.cs
- FontUnitConverter.cs
- ResourcePool.cs
- GroupJoinQueryOperator.cs
- XmlDataLoader.cs
- StateDesigner.cs
- returneventsaver.cs
- GenericTypeParameterBuilder.cs
- EventLogWatcher.cs
- EventLogReader.cs
- HtmlDocument.cs
- BamlTreeNode.cs
- XmlWriter.cs
- CSharpCodeProvider.cs
- FormatterConverter.cs
- ChildDocumentBlock.cs
- SR.cs
- ColorAnimationBase.cs
- Trace.cs
- PeerNameRecord.cs
- Listbox.cs
- TrustManagerMoreInformation.cs
- PermissionListSet.cs
- XmlDigitalSignatureProcessor.cs
- MD5.cs
- HierarchicalDataSourceControl.cs
- MethodCallConverter.cs
- ProofTokenCryptoHandle.cs
- CssTextWriter.cs
- Normalization.cs
- SerializationInfoEnumerator.cs
- SerializationInfo.cs
- SymmetricKey.cs
- WebRequestModulesSection.cs
- PropertyExpression.cs
- XmlQueryContext.cs
- ECDsaCng.cs
- WebBrowserHelper.cs
- SynchronizedReadOnlyCollection.cs
- DrawListViewSubItemEventArgs.cs
- XmlNamespaceManager.cs
- FixedDSBuilder.cs
- WindowsProgressbar.cs
- securitymgrsite.cs
- MessageQueueInstaller.cs
- DataContract.cs
- BlurBitmapEffect.cs
- ConnectionConsumerAttribute.cs
- ParserContext.cs
- FilterEventArgs.cs
- WindowHelperService.cs
- EncoderReplacementFallback.cs
- SchemaCollectionPreprocessor.cs
- ThreadExceptionDialog.cs
- PartialCachingControl.cs
- WindowsAltTab.cs
- RelatedImageListAttribute.cs
- SoapIgnoreAttribute.cs
- WCFBuildProvider.cs
- ThrowOnMultipleAssignment.cs
- DataRecordInternal.cs
- MediaTimeline.cs
- GraphicsContext.cs
- SharedHttpsTransportManager.cs
- NamedPipeTransportElement.cs
- ActiveXHelper.cs
- BuildManager.cs
- RuntimeArgumentHandle.cs
- FileDetails.cs
- PrintDialog.cs
- X509ChainPolicy.cs
- safePerfProviderHandle.cs
- HtmlFormWrapper.cs
- InfiniteIntConverter.cs
- CultureSpecificCharacterBufferRange.cs
- sqlmetadatafactory.cs
- IncrementalReadDecoders.cs
- ClusterSafeNativeMethods.cs
- ColorAnimationBase.cs
- ProxyHwnd.cs
- GreaterThan.cs