SlimUpgradeableReadLockHolder
using System;
using System.Threading;
namespace Castle.MicroKernel.Internal
{
internal class SlimUpgradeableReadLockHolder : IUpgradeableLockHolder, ILockHolder, IDisposable
{
private readonly ReaderWriterLockSlim locker;
private SlimWriteLockHolder writerLock;
private readonly bool wasLockAlreadySelf;
public bool LockAcquired { get; set; }
public SlimUpgradeableReadLockHolder(ReaderWriterLockSlim locker, bool waitForLock, bool wasLockAlreadySelf)
{
this.locker = locker;
if (wasLockAlreadySelf) {
LockAcquired = true;
this.wasLockAlreadySelf = true;
} else if (waitForLock) {
locker.EnterUpgradeableReadLock();
LockAcquired = true;
} else {
LockAcquired = locker.TryEnterUpgradeableReadLock(0);
}
}
public void Dispose()
{
if (writerLock != null && writerLock.LockAcquired) {
writerLock.Dispose();
writerLock = null;
}
if (LockAcquired) {
if (!wasLockAlreadySelf)
locker.ExitUpgradeableReadLock();
LockAcquired = false;
}
}
public ILockHolder Upgrade()
{
return Upgrade(true);
}
public ILockHolder Upgrade(bool waitForLock)
{
if (locker.IsWriteLockHeld)
return NoOpLock.Lock;
writerLock = new SlimWriteLockHolder(locker, waitForLock);
return writerLock;
}
}
}