namespace MfGames.Locking; /// /// Defines a ReaderWriterLockSlim write lock. /// public class NestableWriteLock : IDisposable { private readonly bool lockAcquired; private readonly ReaderWriterLockSlim readerWriterLockSlim; /// /// Initializes a new instance of the class. /// /// The reader writer lock slim. public NestableWriteLock(ReaderWriterLockSlim readerWriterLockSlim) { // Keep track of the lock since we'll need it to release the lock. this.readerWriterLockSlim = readerWriterLockSlim; // If we already have a read or write lock, we don't do anything. if (readerWriterLockSlim.IsWriteLockHeld) { this.lockAcquired = false; } else { readerWriterLockSlim.EnterWriteLock(); this.lockAcquired = true; } } /// public void Dispose() { if (this.lockAcquired) { this.readerWriterLockSlim.ExitWriteLock(); } } }