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