using System;
using System.Threading;
namespace JD.Threading
{
///
/// Basic read/writer lock.
///
public class ReadWriterLock
{
#region Variables
private readonly ReaderWriterLockSlim m_lock;
private readonly IDisposable m_releaseWriterLock;
private readonly IDisposable m_releaseReaderLock;
#endregion
#region Creation
private ReadWriterLock(LockRecursionPolicy policy)
{
m_lock = new ReaderWriterLockSlim(policy);
m_releaseWriterLock = new ExitWriteLock(m_lock);
m_releaseReaderLock = new ExitReadLock(m_lock);
}
public static ReadWriterLock Create()
{
return new ReadWriterLock(LockRecursionPolicy.SupportsRecursion);
}
///
/// Faster but requires that no call is reentrant.
///
///
public static ReadWriterLock CreateWithoutRecursion()
{
return new ReadWriterLock(LockRecursionPolicy.NoRecursion);
}
#endregion
#region Methods
public IDisposable EnterWrite()
{
m_lock.EnterWriteLock();
return m_releaseWriterLock;
}
public IDisposable EnterRead()
{
m_lock.EnterReadLock();
return m_releaseReaderLock;
}
#endregion
#region Nested
private class ExitReadLock : IDisposable
{
private readonly ReaderWriterLockSlim m_lock;
public ExitReadLock(ReaderWriterLockSlim @lock)
{
m_lock = @lock;
}
public void Dispose()
{
m_lock.ExitReadLock();
}
}
private class ExitWriteLock : IDisposable
{
private readonly ReaderWriterLockSlim m_lock;
public ExitWriteLock(ReaderWriterLockSlim @lock)
{
m_lock = @lock;
}
public void Dispose()
{
m_lock.ExitWriteLock();
}
}
#endregion
}
}