// // Copyright (c) Moonfire Games. // This code is licensed under the MIT license. // See LICENSE.md in the source or https://opensource.org/licenses/MIT // namespace MfGames.Locking { using System; using System.Threading; /// /// Defines a ReaderWriterLockSlim upgradable read lock. /// public class NestableUpgradableReadLock : IDisposable { private readonly bool lockAcquired; private readonly ReaderWriterLockSlim readerWriterLockSlim; /// /// Initializes a new instance of the class. /// /// The reader writer lock slim. public NestableUpgradableReadLock(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.IsUpgradeableReadLockHeld || readerWriterLockSlim.IsWriteLockHeld) { this.lockAcquired = false; } else { readerWriterLockSlim.EnterUpgradeableReadLock(); this.lockAcquired = true; } } /// public void Dispose() { if (this.lockAcquired) { this.readerWriterLockSlim.ExitUpgradeableReadLock(); } } } }