//
// 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 read-only lock.
///
public class NestableReadLock : IDisposable
{
private readonly bool lockAcquired;
private readonly ReaderWriterLockSlim readerWriterLockSlim;
///
/// Initializes a new instance of the class.
///
/// The reader writer lock slim.
public NestableReadLock(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.IsReadLockHeld
|| readerWriterLockSlim.IsUpgradeableReadLockHeld
|| readerWriterLockSlim.IsWriteLockHeld)
{
this.lockAcquired = false;
}
else
{
readerWriterLockSlim.EnterReadLock();
this.lockAcquired = true;
}
}
///
public void Dispose()
{
if (this.lockAcquired)
{
this.readerWriterLockSlim.ExitReadLock();
}
}
}
}