2024-08-21 10:09:17 -04:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Threading;
|
2024-08-21 06:17:23 -04:00
|
|
|
|
|
2024-08-21 10:09:17 -04:00
|
|
|
|
namespace Nop.Core.ComponentModel
|
2024-08-21 06:17:23 -04:00
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
2024-08-21 10:09:17 -04:00
|
|
|
|
/// Provides a convenience methodology for implementing locked access to resources.
|
2024-08-21 06:17:23 -04:00
|
|
|
|
/// </summary>
|
2024-08-21 10:09:17 -04:00
|
|
|
|
/// <remarks>
|
|
|
|
|
|
/// Intended as an infrastructure class.
|
|
|
|
|
|
/// </remarks>
|
|
|
|
|
|
public class ReaderWriteLockDisposable : IDisposable
|
2024-08-21 06:17:23 -04:00
|
|
|
|
{
|
2024-08-21 10:09:17 -04:00
|
|
|
|
private bool _disposed = false;
|
|
|
|
|
|
private readonly ReaderWriterLockSlim _rwLock;
|
|
|
|
|
|
private readonly ReaderWriteLockType _readerWriteLockType;
|
2024-08-21 06:17:23 -04:00
|
|
|
|
|
2024-08-21 10:09:17 -04:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Initializes a new instance of the <see cref="ReaderWriteLockDisposable"/> class.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="rwLock">The readers–writer lock</param>
|
|
|
|
|
|
/// <param name="readerWriteLockType">Lock type</param>
|
|
|
|
|
|
public ReaderWriteLockDisposable(ReaderWriterLockSlim rwLock, ReaderWriteLockType readerWriteLockType = ReaderWriteLockType.Write)
|
2024-08-21 06:17:23 -04:00
|
|
|
|
{
|
2024-08-21 10:09:17 -04:00
|
|
|
|
_rwLock = rwLock;
|
|
|
|
|
|
_readerWriteLockType = readerWriteLockType;
|
2024-08-21 06:17:23 -04:00
|
|
|
|
|
|
|
|
|
|
switch (_readerWriteLockType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case ReaderWriteLockType.Read:
|
2024-08-21 10:09:17 -04:00
|
|
|
|
_rwLock.EnterReadLock();
|
2024-08-21 06:17:23 -04:00
|
|
|
|
break;
|
|
|
|
|
|
case ReaderWriteLockType.Write:
|
2024-08-21 10:09:17 -04:00
|
|
|
|
_rwLock.EnterWriteLock();
|
2024-08-21 06:17:23 -04:00
|
|
|
|
break;
|
|
|
|
|
|
case ReaderWriteLockType.UpgradeableRead:
|
2024-08-21 10:09:17 -04:00
|
|
|
|
_rwLock.EnterUpgradeableReadLock();
|
2024-08-21 06:17:23 -04:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-08-21 10:09:17 -04:00
|
|
|
|
// Public implementation of Dispose pattern callable by consumers.
|
|
|
|
|
|
public void Dispose()
|
|
|
|
|
|
{
|
|
|
|
|
|
Dispose(true);
|
|
|
|
|
|
GC.SuppressFinalize(this);
|
|
|
|
|
|
}
|
2024-08-21 06:17:23 -04:00
|
|
|
|
|
2024-08-21 10:09:17 -04:00
|
|
|
|
// Protected implementation of Dispose pattern.
|
|
|
|
|
|
protected virtual void Dispose(bool disposing)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_disposed)
|
|
|
|
|
|
return;
|
2024-08-21 06:17:23 -04:00
|
|
|
|
|
2024-08-21 10:09:17 -04:00
|
|
|
|
if (disposing)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (_readerWriteLockType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case ReaderWriteLockType.Read:
|
|
|
|
|
|
_rwLock.ExitReadLock();
|
|
|
|
|
|
break;
|
|
|
|
|
|
case ReaderWriteLockType.Write:
|
|
|
|
|
|
_rwLock.ExitWriteLock();
|
|
|
|
|
|
break;
|
|
|
|
|
|
case ReaderWriteLockType.UpgradeableRead:
|
|
|
|
|
|
_rwLock.ExitUpgradeableReadLock();
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
_disposed = true;
|
|
|
|
|
|
}
|
2024-08-21 06:17:23 -04:00
|
|
|
|
}
|
2024-08-21 10:09:17 -04:00
|
|
|
|
}
|