93 lines
No EOL
2.1 KiB
C#
93 lines
No EOL
2.1 KiB
C#
using System;
|
|
using System.Threading;
|
|
|
|
namespace JD.Threading
|
|
{
|
|
/// <summary>
|
|
/// Basic read/writer lock.
|
|
/// </summary>
|
|
|
|
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);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Faster but requires that no call is reentrant.
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
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
|
|
}
|
|
} |