SlimReadWriteLock
using System.Threading;
namespace Castle.MicroKernel.Internal
{
public class SlimReadWriteLock : Lock
{
private readonly ReaderWriterLockSlim locker = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);
public bool IsReadLockHeld => locker.IsReadLockHeld;
public bool IsUpgradeableReadLockHeld => locker.IsUpgradeableReadLockHeld;
public bool IsWriteLockHeld => locker.IsWriteLockHeld;
public override IUpgradeableLockHolder ForReadingUpgradeable()
{
return ForReadingUpgradeable(true);
}
public override ILockHolder ForReading()
{
return ForReading(true);
}
public override ILockHolder ForWriting()
{
return ForWriting(true);
}
public override IUpgradeableLockHolder ForReadingUpgradeable(bool waitForLock)
{
return new SlimUpgradeableReadLockHolder(locker, waitForLock, locker.IsUpgradeableReadLockHeld || locker.IsWriteLockHeld);
}
public override ILockHolder ForReading(bool waitForLock)
{
if (locker.IsReadLockHeld || locker.IsUpgradeableReadLockHeld || locker.IsWriteLockHeld)
return NoOpLock.Lock;
return new SlimReadLockHolder(locker, waitForLock);
}
public override ILockHolder ForWriting(bool waitForLock)
{
if (!locker.IsWriteLockHeld)
return new SlimWriteLockHolder(locker, waitForLock);
return NoOpLock.Lock;
}
}
}