diff --git a/src/NHibernate/Util/AsyncReaderWriterLock.cs b/src/NHibernate/Util/AsyncReaderWriterLock.cs index 46d25b99c9f..bd533bc4172 100644 --- a/src/NHibernate/Util/AsyncReaderWriterLock.cs +++ b/src/NHibernate/Util/AsyncReaderWriterLock.cs @@ -82,23 +82,23 @@ public async Task WriteLockAsync() public Releaser ReadLock() { - if (CanEnterReadLock()) + if (CanEnterReadLock(out var waitingReadLockSemaphore)) { return _readerReleaser; } - _waitingReadLockSemaphore.Wait(); + waitingReadLockSemaphore.Wait(); return _readerReleaser; } public Task ReadLockAsync() { - return CanEnterReadLock() ? _readerReleaserTask : ReadLockInternalAsync(); + return CanEnterReadLock(out var waitingReadLockSemaphore) ? _readerReleaserTask : ReadLockInternalAsync(); async Task ReadLockInternalAsync() { - await _waitingReadLockSemaphore.WaitAsync().ConfigureAwait(false); + await waitingReadLockSemaphore.WaitAsync().ConfigureAwait(false); return _readerReleaser; } @@ -165,7 +165,7 @@ private void ExitWriteLock() } } - private bool CanEnterReadLock() + private bool CanEnterReadLock(out SemaphoreSlim waitingReadLockSemaphore) { lock (_writeLockSemaphore) { @@ -173,6 +173,7 @@ private bool CanEnterReadLock() if (_writersWaiting == 0 && _writeLockSemaphore.CurrentCount > 0) { _currentReaders++; + waitingReadLockSemaphore = null; return true; } @@ -183,6 +184,7 @@ private bool CanEnterReadLock() } _readersWaiting++; + waitingReadLockSemaphore = _waitingReadLockSemaphore; return false; }