1
0

Erweiterung der UnitTests und kleinere Fixes

This commit is contained in:
2021-11-17 23:30:54 +01:00
parent 3a0732dd22
commit 80fc6ff2b3
16 changed files with 873 additions and 37 deletions

View File

@@ -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,
}
}
}