Example #1
0
        /// <summary>
        /// Runs operation with Writer lock privelege.
        /// </summary>
        /// <param name="lockObj"></param>
        /// <param name="timeout"></param>
        /// <param name="doWork"></param>
        /// <returns></returns>
        public static void GetWriteLock(ReaderWriterLock lockObj, int timeout, DoWorkFunc doWork)
        {
            RWLockStatus status    = (lockObj.IsWriterLockHeld ? RWLockStatus.WRITE_LOCK : (lockObj.IsReaderLockHeld ? RWLockStatus.READ_LOCK : RWLockStatus.UNLOCKED));
            LockCookie   writeLock = default(LockCookie);

            if (status == RWLockStatus.READ_LOCK)
            {
                writeLock = lockObj.UpgradeToWriterLock(timeout);
            }
            else if (status == RWLockStatus.UNLOCKED)
            {
                lockObj.AcquireWriterLock(timeout);
            }
            try {
                doWork();
            } finally {
                if (status == RWLockStatus.READ_LOCK)
                {
                    lockObj.DowngradeFromWriterLock(ref writeLock);
                }
                else if (status == RWLockStatus.UNLOCKED)
                {
                    lockObj.ReleaseWriterLock();
                }
            }
        }
Example #2
0
        /// <summary>
        /// Runs operation with Reader lock privilege.
        /// </summary>
        /// <param name="lockObj"></param>
        /// <param name="timeout"></param>
        /// <param name="doWork"></param>
        /// <returns></returns>
        public static void GetReadLock(ReaderWriterLock lockObj, int timeout, DoWorkFunc doWork)
        {
            bool releaseLock = false;

            if (!lockObj.IsWriterLockHeld && !lockObj.IsReaderLockHeld)
            {
                lockObj.AcquireReaderLock(timeout);
                releaseLock = true;
            }
            try {
                doWork();
            } finally {
                if (releaseLock)
                {
                    lockObj.ReleaseReaderLock();
                }
            }
        }
Example #3
0
        public static ResultType GetReadLock <ResultType>(ReaderWriterLockSlim lockObj, int timeout, DoWorkFunc <ResultType> doWork)
        {
            bool releaseLock = false;

            if (!lockObj.IsWriteLockHeld && !lockObj.IsReadLockHeld)
            {
                lockObj.EnterUpgradeableReadLock();
                releaseLock = true;
            }

            try
            {
                return(doWork());
            }
            finally
            {
                if (releaseLock)
                {
                    lockObj.ExitUpgradeableReadLock();
                }
            }
        }
Example #4
0
        public static ResultType GetWriteLock <ResultType>(ReaderWriterLockSlim lockObj, int timeout, DoWorkFunc <ResultType> doWork)
        {
            LockStatus status = (lockObj.IsWriteLockHeld
                ? LockStatus.WriteLock
                : (lockObj.IsReadLockHeld ? LockStatus.ReadLock : LockStatus.Unlocked));

            if (status == LockStatus.ReadLock)
            {
                lockObj.TryEnterWriteLock(timeout);
            }
            else if (status == LockStatus.Unlocked)
            {
                lockObj.TryEnterWriteLock(timeout);
            }

            try
            {
                return(doWork());
            }
            finally
            {
                if (status == LockStatus.ReadLock)
                {
                    lockObj.ExitWriteLock();
                }
                else if (status == LockStatus.Unlocked)
                {
                    lockObj.ExitWriteLock();
                }
            }
        }
Example #5
0
        public static TResult GetReadLock <TResult>(ReaderWriterLock lockObj, int timeout, DoWorkFunc <TResult> doWork)
        {
            var releaseLock = false;

            if (!lockObj.IsWriterLockHeld && !lockObj.IsReaderLockHeld)
            {
                lockObj.AcquireReaderLock(timeout);
                releaseLock = true;
            }
            try
            {
                return(doWork());
            }
            finally
            {
                if (releaseLock)
                {
                    lockObj.ReleaseReaderLock();
                }
            }
        }
Example #6
0
        public static TResult GetWriteLock <TResult>(ReaderWriterLock lockObj, int timeout, DoWorkFunc <TResult> doWork)
        {
            var status    = (lockObj.IsWriterLockHeld ? RWLockStatus.WriteLock : (lockObj.IsReaderLockHeld ? RWLockStatus.ReadLock : RWLockStatus.Unlocked));
            var writeLock = default(LockCookie);

            if (status == RWLockStatus.ReadLock)
            {
                writeLock = lockObj.UpgradeToWriterLock(timeout);
            }
            else if (status == RWLockStatus.Unlocked)
            {
                lockObj.AcquireWriterLock(timeout);
            }
            try
            {
                return(doWork());
            }
            finally
            {
                if (status == RWLockStatus.ReadLock)
                {
                    lockObj.DowngradeFromWriterLock(ref writeLock);
                }
                else if (status == RWLockStatus.Unlocked)
                {
                    lockObj.ReleaseWriterLock();
                }
            }
        }