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
- ThemeDictionaryExtension.cs
- MenuItem.cs
- Matrix3D.cs
- PageTheme.cs
- MetadataFile.cs
- IdentityReference.cs
- MembershipPasswordException.cs
- FixedTextContainer.cs
- ToolBar.cs
- SiteMapNode.cs
- DataContractSerializerOperationFormatter.cs
- XPathScanner.cs
- DivideByZeroException.cs
- RequestTimeoutManager.cs
- LayoutEditorPart.cs
- ProfileProvider.cs
- TextOptions.cs
- TemplateControl.cs
- TaiwanLunisolarCalendar.cs
- Subordinate.cs
- AggregationMinMaxHelpers.cs
- XmlAnyElementAttribute.cs
- XmlIgnoreAttribute.cs
- ColumnCollection.cs
- XmlMtomReader.cs
- HMACSHA384.cs
- VisualState.cs
- IItemContainerGenerator.cs
- StreamResourceInfo.cs
- ASCIIEncoding.cs
- DocumentViewerHelper.cs
- StorageScalarPropertyMapping.cs
- FontNameConverter.cs
- SoapElementAttribute.cs
- XmlBindingWorker.cs
- StylusDevice.cs
- TextEncodedRawTextWriter.cs
- WpfMemberInvoker.cs
- IMembershipProvider.cs
- QilCloneVisitor.cs
- WebPartChrome.cs
- DataControlImageButton.cs
- ExpandSegment.cs
- ActivityCollectionMarkupSerializer.cs
- FileLevelControlBuilderAttribute.cs
- GrabHandleGlyph.cs
- LogLogRecordEnumerator.cs
- CodeObject.cs
- LeaseManager.cs
- ThemeDirectoryCompiler.cs
- CustomTypeDescriptor.cs
- FocusManager.cs
- WindowsListViewItem.cs
- WebBrowserBase.cs
- CroppedBitmap.cs
- __ComObject.cs
- HitTestWithPointDrawingContextWalker.cs
- MemberAccessException.cs
- DataPagerFieldItem.cs
- DesignerCategoryAttribute.cs
- DataBoundLiteralControl.cs
- CriticalExceptions.cs
- loginstatus.cs
- MobileControlDesigner.cs
- DeviceContext2.cs
- IsolatedStorageException.cs
- IISMapPath.cs
- WithStatement.cs
- DockAndAnchorLayout.cs
- DbParameterCollectionHelper.cs
- TextHidden.cs
- ServiceDocumentFormatter.cs
- MetadataCache.cs
- EntityClientCacheEntry.cs
- XamlUtilities.cs
- OleDbReferenceCollection.cs
- KeyboardInputProviderAcquireFocusEventArgs.cs
- bindurihelper.cs
- AtomServiceDocumentSerializer.cs
- _DomainName.cs
- StrokeNodeData.cs
- PersonalizationProvider.cs
- WebBrowserNavigatingEventHandler.cs
- CalendarButton.cs
- SettingsProviderCollection.cs
- Msmq4PoisonHandler.cs
- CancelEventArgs.cs
- AutoResetEvent.cs
- ISessionStateStore.cs
- DelayedRegex.cs
- DataControlButton.cs
- RegexGroup.cs
- Registry.cs
- MasterPage.cs
- FormsAuthenticationModule.cs
- TextSpan.cs
- WebPartConnectionsConnectVerb.cs
- ObjectKeyFrameCollection.cs
- EventLogQuery.cs
- CriticalFinalizerObject.cs