From 4950b8132d5a9232966228dbd36b29538542947a Mon Sep 17 00:00:00 2001 From: maca88 Date: Tue, 4 Aug 2020 21:09:36 +0200 Subject: [PATCH] Fix NRE in AsyncReaderWriterLock.ReadLock method --- src/NHibernate/Util/AsyncReaderWriterLock.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) 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; }