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
- EntityDataReader.cs
- PrinterSettings.cs
- GraphicsPath.cs
- ISessionStateStore.cs
- SwitchElementsCollection.cs
- BuilderPropertyEntry.cs
- WindowsPrincipal.cs
- TextEffect.cs
- XmlBinaryWriter.cs
- DbParameterCollection.cs
- AndCondition.cs
- InheritedPropertyChangedEventArgs.cs
- TaskFormBase.cs
- DetailsViewUpdateEventArgs.cs
- DialogBaseForm.cs
- WriteableBitmap.cs
- ListViewItemEventArgs.cs
- SimpleFieldTemplateFactory.cs
- ChannelSinkStacks.cs
- SystemWebCachingSectionGroup.cs
- DataBoundControl.cs
- SecurityDescriptor.cs
- FileLogRecordEnumerator.cs
- TextParagraphProperties.cs
- PasswordBox.cs
- MenuEventArgs.cs
- BinHexEncoder.cs
- TemplateDefinition.cs
- StatusBarDesigner.cs
- LostFocusEventManager.cs
- SelectionChangedEventArgs.cs
- DataGridCellItemAutomationPeer.cs
- XmlWellformedWriter.cs
- OptimizedTemplateContentHelper.cs
- IndexedGlyphRun.cs
- UnitySerializationHolder.cs
- Vars.cs
- FusionWrap.cs
- IMembershipProvider.cs
- CellNormalizer.cs
- LocatorBase.cs
- ExtensionWindow.cs
- Visual3DCollection.cs
- DataGridViewLayoutData.cs
- TreeViewCancelEvent.cs
- WindowHelperService.cs
- ButtonFlatAdapter.cs
- MediaContextNotificationWindow.cs
- XmlAtomicValue.cs
- DeviceContext.cs
- XmlDocumentSerializer.cs
- Graph.cs
- validationstate.cs
- BatchWriter.cs
- DiscoveryDocumentLinksPattern.cs
- AlternateViewCollection.cs
- ExtensibleClassFactory.cs
- newitemfactory.cs
- DataControlButton.cs
- DefinitionBase.cs
- HostProtectionException.cs
- OrderedEnumerableRowCollection.cs
- Directory.cs
- TextEditorTables.cs
- UnmanagedBitmapWrapper.cs
- EntityConnectionStringBuilder.cs
- DataListComponentEditor.cs
- EmptyQuery.cs
- RowBinding.cs
- NestedContainer.cs
- EventLogReader.cs
- figurelength.cs
- DataPager.cs
- EndEvent.cs
- WpfGeneratedKnownTypes.cs
- ExtractCollection.cs
- ISFClipboardData.cs
- ContentAlignmentEditor.cs
- WebAdminConfigurationHelper.cs
- ControlParameter.cs
- StateMachineTimers.cs
- HwndHost.cs
- Point3DCollectionValueSerializer.cs
- HealthMonitoringSectionHelper.cs
- RemoveFromCollection.cs
- LogReserveAndAppendState.cs
- CaseInsensitiveComparer.cs
- SuppressMergeCheckAttribute.cs
- xsdvalidator.cs
- ResourceManager.cs
- StringSorter.cs
- EvidenceTypeDescriptor.cs
- X509ThumbprintKeyIdentifierClause.cs
- CachedFontFace.cs
- DataGridItem.cs
- ECDsaCng.cs
- OutputCacheProfileCollection.cs
- RegexCompilationInfo.cs
- Soap.cs
- DeviceContext.cs