1
- using System ;
1
+ using System ;
2
2
using System . Threading ;
3
3
using System . Threading . Tasks ;
4
4
@@ -9,6 +9,7 @@ namespace NHibernate.Util
9
9
// https://devblogs.microsoft.com/pfxteam/building-async-coordination-primitives-part-7-asyncreaderwriterlock/
10
10
internal class AsyncReaderWriterLock : IDisposable , Cache . ICacheLock
11
11
{
12
+ private readonly Lock _writeLockLock = LockFactory . Create ( ) ;
12
13
private readonly SemaphoreSlim _writeLockSemaphore = new SemaphoreSlim ( 1 , 1 ) ;
13
14
private readonly SemaphoreSlim _readLockSemaphore = new SemaphoreSlim ( 0 , 1 ) ;
14
15
private readonly Releaser _writerReleaser ;
@@ -48,7 +49,7 @@ public Releaser WriteLock()
48
49
if ( ! CanEnterWriteLock ( out var waitForReadLocks ) )
49
50
{
50
51
_writeLockSemaphore . Wait ( ) ;
51
- lock ( _writeLockSemaphore )
52
+ lock ( _writeLockLock )
52
53
{
53
54
_writersWaiting -- ;
54
55
}
@@ -74,7 +75,7 @@ public async Task<Releaser> WriteLockAsync()
74
75
if ( ! CanEnterWriteLock ( out var waitForReadLocks ) )
75
76
{
76
77
await _writeLockSemaphore . WaitAsync ( ) . ConfigureAwait ( false ) ;
77
- lock ( _writeLockSemaphore )
78
+ lock ( _writeLockLock )
78
79
{
79
80
_writersWaiting -- ;
80
81
}
@@ -126,7 +127,7 @@ async Task<Releaser> ReadLockInternalAsync()
126
127
127
128
public void Dispose ( )
128
129
{
129
- lock ( _writeLockSemaphore )
130
+ lock ( _writeLockLock )
130
131
{
131
132
_writeLockSemaphore . Dispose ( ) ;
132
133
_readLockSemaphore . Dispose ( ) ;
@@ -139,7 +140,7 @@ public void Dispose()
139
140
private bool CanEnterWriteLock ( out bool waitForReadLocks )
140
141
{
141
142
waitForReadLocks = false ;
142
- lock ( _writeLockSemaphore )
143
+ lock ( _writeLockLock )
143
144
{
144
145
AssertNotDisposed ( ) ;
145
146
if ( _writeLockSemaphore . CurrentCount > 0 && _writeLockSemaphore . Wait ( 0 ) )
@@ -156,7 +157,7 @@ private bool CanEnterWriteLock(out bool waitForReadLocks)
156
157
157
158
private void ExitWriteLock ( )
158
159
{
159
- lock ( _writeLockSemaphore )
160
+ lock ( _writeLockLock )
160
161
{
161
162
AssertNotDisposed ( ) ;
162
163
if ( _writeLockSemaphore . CurrentCount == 1 )
@@ -187,7 +188,7 @@ private void ExitWriteLock()
187
188
188
189
private bool CanEnterReadLock ( out SemaphoreSlim waitingReadLockSemaphore )
189
190
{
190
- lock ( _writeLockSemaphore )
191
+ lock ( _writeLockLock )
191
192
{
192
193
AssertNotDisposed ( ) ;
193
194
if ( _writersWaiting == 0 && _writeLockSemaphore . CurrentCount > 0 )
@@ -212,7 +213,7 @@ private bool CanEnterReadLock(out SemaphoreSlim waitingReadLockSemaphore)
212
213
213
214
private void ExitReadLock ( )
214
215
{
215
- lock ( _writeLockSemaphore )
216
+ lock ( _writeLockLock )
216
217
{
217
218
AssertNotDisposed ( ) ;
218
219
if ( _currentReaders == 0 )
0 commit comments