/// <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(); } } }
/// <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(); } } }
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(); } } }
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(); } } }
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(); } } }
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(); } } }