Erweiterung der UnitTests und kleinere Fixes
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
namespace System.Threading
|
||||
//[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("AMWD.Common.Tests")]
|
||||
|
||||
namespace System.Threading
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides extension methods for the <see cref="ReaderWriterLockSlim"/>.
|
||||
@@ -18,7 +20,7 @@
|
||||
if (!rwLock.TryEnterReadLock(timeoutMilliseconds))
|
||||
throw new TimeoutException("The read lock could not be acquired.");
|
||||
|
||||
return new RWLockDisposable(rwLock, 1);
|
||||
return new DisposableReadWriteLock(rwLock, LockMode.Read);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -37,7 +39,7 @@
|
||||
if (!rwLock.TryEnterUpgradeableReadLock(timeoutMilliseconds))
|
||||
throw new TimeoutException("The upgradeable read lock could not be acquired.");
|
||||
|
||||
return new RWLockDisposable(rwLock, 2);
|
||||
return new DisposableReadWriteLock(rwLock, LockMode.Upgradable);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -53,15 +55,15 @@
|
||||
if (!rwLock.TryEnterWriteLock(timeoutMilliseconds))
|
||||
throw new TimeoutException("The write lock could not be acquired.");
|
||||
|
||||
return new RWLockDisposable(rwLock, 3);
|
||||
return new DisposableReadWriteLock(rwLock, LockMode.Write);
|
||||
}
|
||||
|
||||
private struct RWLockDisposable : IDisposable
|
||||
private struct DisposableReadWriteLock : IDisposable
|
||||
{
|
||||
private readonly ReaderWriterLockSlim rwLock;
|
||||
private int lockMode;
|
||||
private LockMode lockMode;
|
||||
|
||||
public RWLockDisposable(ReaderWriterLockSlim rwLock, int lockMode)
|
||||
public DisposableReadWriteLock(ReaderWriterLockSlim rwLock, LockMode lockMode)
|
||||
{
|
||||
this.rwLock = rwLock;
|
||||
this.lockMode = lockMode;
|
||||
@@ -69,16 +71,28 @@
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (lockMode == 1)
|
||||
if (lockMode == LockMode.Read)
|
||||
rwLock.ExitReadLock();
|
||||
if (lockMode == 2 && rwLock.IsWriteLockHeld) // Upgraded with EnterWriteLock alone
|
||||
|
||||
if (lockMode == LockMode.Upgradable && rwLock.IsWriteLockHeld) // Upgraded with EnterWriteLock alone
|
||||
rwLock.ExitWriteLock();
|
||||
if (lockMode == 2)
|
||||
|
||||
if (lockMode == LockMode.Upgradable)
|
||||
rwLock.ExitUpgradeableReadLock();
|
||||
if (lockMode == 3)
|
||||
|
||||
if (lockMode == LockMode.Write)
|
||||
rwLock.ExitWriteLock();
|
||||
lockMode = 0;
|
||||
|
||||
lockMode = LockMode.None;
|
||||
}
|
||||
}
|
||||
|
||||
private enum LockMode
|
||||
{
|
||||
None = 0,
|
||||
Read = 1,
|
||||
Upgradable = 2,
|
||||
Write = 3,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user