InstanceLockTracking.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.Activities.DurableInstancing / System / Activities / DurableInstancing / InstanceLockTracking.cs / 1305376 / InstanceLockTracking.cs

                            //------------------------------------------------------------------------------ 
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------

namespace System.Activities.DurableInstancing 
{
    using System.Runtime.DurableInstancing; 
    using System.Transactions; 

    sealed class InstanceLockTracking 
    {
        object synchLock;
        SqlWorkflowInstanceStore store;
 
        public InstanceLockTracking(SqlWorkflowInstanceStore store)
        { 
            this.InstanceId = Guid.Empty; 
            this.store = store;
            this.synchLock = new object(); 
        }

        public Guid InstanceId { get; set; }
        public bool BoundToLock { get; set; } 
        public long InstanceVersion { get; set; }
        public bool IsHandleFreed { get; set; } 
        public bool IsSafeToUnlock { get; set; } 

        public void HandleFreed() 
        {
            lock (this.synchLock)
            {
                if (this.BoundToLock && this.IsSafeToUnlock) 
                {
                    this.store.GenerateUnlockCommand(this); 
                } 

                this.IsHandleFreed = true; 
            }
        }

        public void TrackStoreLock(Guid instanceId, long instanceVersion, DependentTransaction dependentTransaction) 
        {
            this.BoundToLock = true; 
            this.InstanceId = instanceId; 
            this.InstanceVersion = instanceVersion;
 
            if (dependentTransaction != null)
            {
                dependentTransaction.TransactionCompleted += new TransactionCompletedEventHandler(TransactionCompleted);
            } 
            else
            { 
                this.IsSafeToUnlock = true; 
            }
        } 

        public void TrackStoreUnlock(DependentTransaction dependentTransaction)
        {
            this.BoundToLock = false; 
            this.IsHandleFreed = true;
 
            if (dependentTransaction != null) 
            {
                dependentTransaction.TransactionCompleted += new TransactionCompletedEventHandler(TransactedUnlockCompleted); 
            }
        }

        void TransactionCompleted(object sender, TransactionEventArgs e) 
        {
            lock (this.synchLock) 
            { 
                if (e.Transaction.TransactionInformation.Status == TransactionStatus.Committed)
                { 
                    if (this.IsHandleFreed)
                    {
                        this.store.GenerateUnlockCommand(this);
                    } 
                    else
                    { 
                        this.IsSafeToUnlock = true; 
                    }
                } 
                else
                {
                    this.BoundToLock = false;
                } 
            }
        } 
 
        void TransactedUnlockCompleted(object sender, TransactionEventArgs e)
        { 
            lock (this.synchLock)
            {
                if (e.Transaction.TransactionInformation.Status != TransactionStatus.Committed && this.IsSafeToUnlock)
                { 
                    this.store.GenerateUnlockCommand(this);
                } 
            } 
        }
    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK