@@ -8,8 +8,6 @@ namespace NHibernate.Test.UtilityTest
8
8
{
9
9
public partial class AsyncReaderWriterLockFixture
10
10
{
11
- private readonly int _delay = 50 ;
12
-
13
11
[ Test ]
14
12
public void TestBlocking ( )
15
13
{
@@ -21,41 +19,41 @@ public void TestBlocking()
21
19
22
20
var readReleaserTask = Task . Run ( ( ) => l . ReadLock ( ) ) ;
23
21
AssertEqualValue ( ( ) => l . CurrentReaders , 2 , readReleaserTask ) ;
24
- Assert . That ( readReleaserTask . Wait ( _delay ) , Is . True ) ;
22
+ AssertTaskCompleted ( readReleaserTask ) ;
25
23
26
24
var writeReleaserTask = Task . Run ( ( ) => l . WriteLock ( ) ) ;
27
25
AssertEqualValue ( ( ) => l . AcquiredWriteLock , true , writeReleaserTask ) ;
28
26
AssertEqualValue ( ( ) => l . Writing , false , writeReleaserTask ) ;
29
- Assert . That ( writeReleaserTask . Wait ( _delay ) , Is . False ) ;
27
+ Assert . That ( writeReleaserTask . IsCompleted , Is . False ) ;
30
28
31
29
readReleaser . Dispose ( ) ;
32
30
Assert . That ( l . CurrentReaders , Is . EqualTo ( 1 ) ) ;
33
- Assert . That ( writeReleaserTask . Wait ( _delay ) , Is . False ) ;
31
+ Assert . That ( writeReleaserTask . IsCompleted , Is . False ) ;
34
32
35
33
readReleaserTask . Result . Dispose ( ) ;
36
34
Assert . That ( l . CurrentReaders , Is . EqualTo ( 0 ) ) ;
37
35
AssertEqualValue ( ( ) => l . Writing , true , writeReleaserTask ) ;
38
- Assert . That ( writeReleaserTask . Wait ( _delay ) , Is . True ) ;
36
+ AssertTaskCompleted ( writeReleaserTask ) ;
39
37
40
38
readReleaserTask = Task . Run ( ( ) => l . ReadLock ( ) ) ;
41
39
AssertEqualValue ( ( ) => l . ReadersWaiting , 1 , readReleaserTask ) ;
42
- Assert . That ( readReleaserTask . Wait ( _delay ) , Is . False ) ;
40
+ Assert . That ( readReleaserTask . IsCompleted , Is . False ) ;
43
41
44
42
var writeReleaserTask2 = Task . Run ( ( ) => l . WriteLock ( ) ) ;
45
43
AssertEqualValue ( ( ) => l . WritersWaiting , 1 , writeReleaserTask2 ) ;
46
- Assert . That ( writeReleaserTask2 . Wait ( _delay ) , Is . False ) ;
44
+ Assert . That ( writeReleaserTask2 . IsCompleted , Is . False ) ;
47
45
48
46
writeReleaserTask . Result . Dispose ( ) ;
49
47
AssertEqualValue ( ( ) => l . WritersWaiting , 0 , writeReleaserTask2 ) ;
50
48
AssertEqualValue ( ( ) => l . Writing , true , writeReleaserTask2 ) ;
51
- Assert . That ( readReleaserTask . Wait ( _delay ) , Is . False ) ;
52
- Assert . That ( writeReleaserTask2 . Wait ( _delay ) , Is . True ) ;
49
+ Assert . That ( readReleaserTask . IsCompleted , Is . False ) ;
50
+ AssertTaskCompleted ( writeReleaserTask2 ) ;
53
51
54
52
writeReleaserTask2 . Result . Dispose ( ) ;
55
53
AssertEqualValue ( ( ) => l . Writing , false , writeReleaserTask2 ) ;
56
54
AssertEqualValue ( ( ) => l . ReadersWaiting , 0 , readReleaserTask ) ;
57
55
AssertEqualValue ( ( ) => l . CurrentReaders , 1 , readReleaserTask ) ;
58
- Assert . That ( readReleaserTask . Wait ( _delay ) , Is . True ) ;
56
+ AssertTaskCompleted ( readReleaserTask ) ;
59
57
60
58
readReleaserTask . Result . Dispose ( ) ;
61
59
Assert . That ( l . ReadersWaiting , Is . EqualTo ( 0 ) ) ;
@@ -73,45 +71,45 @@ public void TestBlockingAsync()
73
71
{
74
72
var readReleaserTask = l . ReadLockAsync ( ) ;
75
73
AssertEqualValue ( ( ) => l . CurrentReaders , 1 , readReleaserTask ) ;
76
- Assert . That ( readReleaserTask . Wait ( _delay ) , Is . True ) ;
74
+ AssertTaskCompleted ( readReleaserTask ) ;
77
75
78
76
var readReleaserTask2 = l . ReadLockAsync ( ) ;
79
77
AssertEqualValue ( ( ) => l . CurrentReaders , 2 , readReleaserTask2 ) ;
80
- Assert . That ( readReleaserTask2 . Wait ( _delay ) , Is . True ) ;
78
+ AssertTaskCompleted ( readReleaserTask2 ) ;
81
79
82
80
var writeReleaserTask = l . WriteLockAsync ( ) ;
83
81
AssertEqualValue ( ( ) => l . AcquiredWriteLock , true , writeReleaserTask ) ;
84
82
AssertEqualValue ( ( ) => l . Writing , false , writeReleaserTask ) ;
85
- Assert . That ( writeReleaserTask . Wait ( _delay ) , Is . False ) ;
83
+ Assert . That ( writeReleaserTask . IsCompleted , Is . False ) ;
86
84
87
85
readReleaserTask . Result . Dispose ( ) ;
88
86
Assert . That ( l . CurrentReaders , Is . EqualTo ( 1 ) ) ;
89
- Assert . That ( writeReleaserTask . Wait ( _delay ) , Is . False ) ;
87
+ Assert . That ( writeReleaserTask . IsCompleted , Is . False ) ;
90
88
91
89
readReleaserTask2 . Result . Dispose ( ) ;
92
90
Assert . That ( l . CurrentReaders , Is . EqualTo ( 0 ) ) ;
93
91
AssertEqualValue ( ( ) => l . Writing , true , writeReleaserTask ) ;
94
- Assert . That ( writeReleaserTask . Wait ( _delay ) , Is . True ) ;
92
+ AssertTaskCompleted ( writeReleaserTask ) ;
95
93
96
94
readReleaserTask = l . ReadLockAsync ( ) ;
97
95
AssertEqualValue ( ( ) => l . ReadersWaiting , 1 , readReleaserTask ) ;
98
- Assert . That ( readReleaserTask . Wait ( _delay ) , Is . False ) ;
96
+ Assert . That ( readReleaserTask . IsCompleted , Is . False ) ;
99
97
100
98
var writeReleaserTask2 = l . WriteLockAsync ( ) ;
101
99
AssertEqualValue ( ( ) => l . WritersWaiting , 1 , writeReleaserTask2 ) ;
102
- Assert . That ( writeReleaserTask2 . Wait ( _delay ) , Is . False ) ;
100
+ Assert . That ( writeReleaserTask2 . IsCompleted , Is . False ) ;
103
101
104
102
writeReleaserTask . Result . Dispose ( ) ;
105
103
AssertEqualValue ( ( ) => l . WritersWaiting , 0 , writeReleaserTask2 ) ;
106
104
AssertEqualValue ( ( ) => l . Writing , true , writeReleaserTask2 ) ;
107
- Assert . That ( readReleaserTask . Wait ( _delay ) , Is . False ) ;
108
- Assert . That ( writeReleaserTask2 . Wait ( _delay ) , Is . True ) ;
105
+ Assert . That ( readReleaserTask . IsCompleted , Is . False ) ;
106
+ AssertTaskCompleted ( writeReleaserTask2 ) ;
109
107
110
108
writeReleaserTask2 . Result . Dispose ( ) ;
111
109
AssertEqualValue ( ( ) => l . Writing , false , writeReleaserTask2 ) ;
112
110
AssertEqualValue ( ( ) => l . ReadersWaiting , 0 , readReleaserTask ) ;
113
111
AssertEqualValue ( ( ) => l . CurrentReaders , 1 , readReleaserTask ) ;
114
- Assert . That ( readReleaserTask . Wait ( _delay ) , Is . True ) ;
112
+ AssertTaskCompleted ( readReleaserTask ) ;
115
113
116
114
readReleaserTask . Result . Dispose ( ) ;
117
115
Assert . That ( l . ReadersWaiting , Is . EqualTo ( 0 ) ) ;
@@ -153,7 +151,7 @@ public void TestMixingSyncAndAsync()
153
151
154
152
var readReleaserTask = l . ReadLockAsync ( ) ;
155
153
AssertEqualValue ( ( ) => l . CurrentReaders , 2 , readReleaserTask ) ;
156
- Assert . That ( readReleaserTask . Wait ( _delay ) , Is . True ) ;
154
+ AssertTaskCompleted ( readReleaserTask ) ;
157
155
158
156
readReleaser . Dispose ( ) ;
159
157
Assert . That ( l . CurrentReaders , Is . EqualTo ( 1 ) ) ;
@@ -166,28 +164,28 @@ public void TestMixingSyncAndAsync()
166
164
167
165
var writeReleaserTask = l . WriteLockAsync ( ) ;
168
166
AssertEqualValue ( ( ) => l . WritersWaiting , 1 , writeReleaserTask ) ;
169
- Assert . That ( writeReleaserTask . Wait ( _delay ) , Is . False ) ;
167
+ Assert . That ( writeReleaserTask . IsCompleted , Is . False ) ;
170
168
171
169
readReleaserTask = Task . Run ( ( ) => l . ReadLock ( ) ) ;
172
170
AssertEqualValue ( ( ) => l . ReadersWaiting , 1 , readReleaserTask ) ;
173
- Assert . That ( readReleaserTask . Wait ( _delay ) , Is . False ) ;
171
+ Assert . That ( readReleaserTask . IsCompleted , Is . False ) ;
174
172
175
173
var readReleaserTask2 = l . ReadLockAsync ( ) ;
176
174
AssertEqualValue ( ( ) => l . ReadersWaiting , 2 , readReleaserTask2 ) ;
177
- Assert . That ( readReleaserTask2 . Wait ( _delay ) , Is . False ) ;
175
+ Assert . That ( readReleaserTask2 . IsCompleted , Is . False ) ;
178
176
179
177
writeReleaser . Dispose ( ) ;
180
178
AssertEqualValue ( ( ) => l . WritersWaiting , 0 , writeReleaserTask ) ;
181
179
AssertEqualValue ( ( ) => l . Writing , true , writeReleaserTask ) ;
182
- Assert . That ( writeReleaserTask . Wait ( _delay ) , Is . True ) ;
183
- Assert . That ( readReleaserTask . Wait ( _delay ) , Is . False ) ;
184
- Assert . That ( readReleaserTask2 . Wait ( _delay ) , Is . False ) ;
180
+ AssertTaskCompleted ( writeReleaserTask ) ;
181
+ Assert . That ( readReleaserTask . IsCompleted , Is . False ) ;
182
+ Assert . That ( readReleaserTask2 . IsCompleted , Is . False ) ;
185
183
186
184
writeReleaserTask . Result . Dispose ( ) ;
187
185
AssertEqualValue ( ( ) => l . CurrentReaders , 2 , readReleaserTask ) ;
188
186
AssertEqualValue ( ( ) => l . ReadersWaiting , 0 , readReleaserTask2 ) ;
189
- Assert . That ( readReleaserTask . Wait ( _delay ) , Is . True ) ;
190
- Assert . That ( readReleaserTask2 . Wait ( _delay ) , Is . True ) ;
187
+ AssertTaskCompleted ( readReleaserTask ) ;
188
+ AssertTaskCompleted ( readReleaserTask2 ) ;
191
189
}
192
190
193
191
[ Test ]
@@ -208,11 +206,11 @@ public void TestWritePriorityOverReadAsync()
208
206
writeReleaser . Dispose ( ) ;
209
207
AssertEqualValue ( ( ) => l . WritersWaiting , 0 , writeReleaserTask ) ;
210
208
AssertEqualValue ( ( ) => l . ReadersWaiting , 1 , readReleaserTask ) ;
211
- Assert . That ( writeReleaserTask . Wait ( _delay ) , Is . True ) ;
209
+ AssertTaskCompleted ( writeReleaserTask ) ;
212
210
213
211
writeReleaserTask . Result . Dispose ( ) ;
214
212
AssertEqualValue ( ( ) => l . ReadersWaiting , 0 , readReleaserTask ) ;
215
- Assert . That ( readReleaserTask . Wait ( _delay ) , Is . True ) ;
213
+ AssertTaskCompleted ( readReleaserTask ) ;
216
214
217
215
readReleaserTask . Result . Dispose ( ) ;
218
216
}
@@ -224,34 +222,34 @@ public void TestPartialReleasingReadLockAsync()
224
222
var l = new AsyncReaderWriterLock ( ) ;
225
223
var readReleaserTask = l . ReadLockAsync ( ) ;
226
224
AssertEqualValue ( ( ) => l . CurrentReaders , 1 , readReleaserTask ) ;
227
- Assert . That ( readReleaserTask . Wait ( _delay ) , Is . True ) ;
225
+ AssertTaskCompleted ( readReleaserTask ) ;
228
226
229
227
var readReleaserTask2 = l . ReadLockAsync ( ) ;
230
228
AssertEqualValue ( ( ) => l . CurrentReaders , 2 , readReleaserTask ) ;
231
- Assert . That ( readReleaserTask2 . Wait ( _delay ) , Is . True ) ;
229
+ AssertTaskCompleted ( readReleaserTask2 ) ;
232
230
233
231
var writeReleaserTask = l . WriteLockAsync ( ) ;
234
232
AssertEqualValue ( ( ) => l . AcquiredWriteLock , true , writeReleaserTask ) ;
235
233
AssertEqualValue ( ( ) => l . Writing , false , writeReleaserTask ) ;
236
- Assert . That ( writeReleaserTask . Wait ( _delay ) , Is . False ) ;
234
+ Assert . That ( writeReleaserTask . IsCompleted , Is . False ) ;
237
235
238
236
var readReleaserTask3 = l . ReadLockAsync ( ) ;
239
237
AssertEqualValue ( ( ) => l . ReadersWaiting , 1 , readReleaserTask3 ) ;
240
- Assert . That ( readReleaserTask3 . Wait ( _delay ) , Is . False ) ;
238
+ Assert . That ( readReleaserTask3 . IsCompleted , Is . False ) ;
241
239
242
240
readReleaserTask . Result . Dispose ( ) ;
243
- Assert . That ( writeReleaserTask . Wait ( _delay ) , Is . False ) ;
244
- Assert . That ( readReleaserTask3 . Wait ( _delay ) , Is . False ) ;
241
+ Assert . That ( writeReleaserTask . IsCompleted , Is . False ) ;
242
+ Assert . That ( readReleaserTask3 . IsCompleted , Is . False ) ;
245
243
246
244
readReleaserTask2 . Result . Dispose ( ) ;
247
245
AssertEqualValue ( ( ) => l . Writing , true , writeReleaserTask ) ;
248
246
AssertEqualValue ( ( ) => l . ReadersWaiting , 1 , readReleaserTask3 ) ;
249
- Assert . That ( writeReleaserTask . Wait ( _delay ) , Is . True ) ;
250
- Assert . That ( readReleaserTask3 . Wait ( _delay ) , Is . False ) ;
247
+ AssertTaskCompleted ( writeReleaserTask ) ;
248
+ Assert . That ( readReleaserTask3 . IsCompleted , Is . False ) ;
251
249
252
250
writeReleaserTask . Result . Dispose ( ) ;
253
251
AssertEqualValue ( ( ) => l . ReadersWaiting , 0 , readReleaserTask3 ) ;
254
- Assert . That ( readReleaserTask3 . Wait ( _delay ) , Is . True ) ;
252
+ AssertTaskCompleted ( readReleaserTask3 ) ;
255
253
}
256
254
257
255
[ Test , Explicit ]
@@ -260,32 +258,20 @@ public async Task TestLoadSyncAndAsync()
260
258
var l = new AsyncReaderWriterLock ( ) ;
261
259
int readLockCount = 0 , writeLockCount = 0 ;
262
260
var incorrectLockCount = false ;
263
- var threads = new Thread [ 10 ] ;
264
- var tasks = new Task [ 10 ] ;
261
+ var tasks = new Task [ 20 ] ;
265
262
var masterRandom = new Random ( ) ;
266
263
var cancellationTokenSource = new CancellationTokenSource ( TimeSpan . FromSeconds ( 10 ) ) ;
267
264
268
- for ( var i = 0 ; i < threads . Length ; i ++ )
269
- {
270
- // Ensure that each random has its own unique seed
271
- var random = new Random ( masterRandom . Next ( ) ) ;
272
- threads [ i ] = new Thread ( ( ) => SyncLock ( random , cancellationTokenSource . Token ) ) ;
273
- threads [ i ] . Start ( ) ;
274
- }
275
-
276
265
for ( var i = 0 ; i < tasks . Length ; i ++ )
277
266
{
278
267
// Ensure that each random has its own unique seed
279
268
var random = new Random ( masterRandom . Next ( ) ) ;
280
- tasks [ i ] = Task . Run ( ( ) => AsyncLock ( random , cancellationTokenSource . Token ) ) ;
269
+ tasks [ i ] = i % 2 == 0
270
+ ? Task . Run ( ( ) => SyncLock ( random , cancellationTokenSource . Token ) )
271
+ : AsyncLock ( random , cancellationTokenSource . Token ) ;
281
272
}
282
273
283
- foreach ( var thread in threads )
284
- {
285
- thread . Join ( ) ;
286
- }
287
-
288
- await Task . WhenAll ( tasks ) . ConfigureAwait ( false ) ;
274
+ await Task . WhenAll ( tasks ) ;
289
275
Assert . That ( incorrectLockCount , Is . False ) ;
290
276
291
277
@@ -341,7 +327,7 @@ async Task AsyncLock(Random random, CancellationToken cancellationToken)
341
327
while ( ! cancellationToken . IsCancellationRequested )
342
328
{
343
329
var isRead = random . Next ( 100 ) < 80 ;
344
- var releaser = isRead
330
+ var releaser = isRead
345
331
? await l . ReadLockAsync ( ) . ConfigureAwait ( false )
346
332
: await l . WriteLockAsync ( ) . ConfigureAwait ( false ) ;
347
333
lock ( l )
@@ -378,10 +364,10 @@ async Task AsyncLock(Random random, CancellationToken cancellationToken)
378
364
}
379
365
}
380
366
381
- private static void AssertEqualValue < T > ( Func < T > getValueFunc , T value , Task task , int waitDelay = 500 )
367
+ private static void AssertEqualValue < T > ( Func < T > getValueFunc , T value , Task task , int waitDelay = 5000 )
382
368
{
383
369
var currentTime = 0 ;
384
- const int step = 5 ;
370
+ var step = 5 ;
385
371
while ( currentTime < waitDelay )
386
372
{
387
373
task . Wait ( step ) ;
@@ -390,9 +376,16 @@ private static void AssertEqualValue<T>(Func<T> getValueFunc, T value, Task task
390
376
{
391
377
return ;
392
378
}
379
+
380
+ step *= 2 ;
393
381
}
394
382
395
383
Assert . That ( getValueFunc ( ) , Is . EqualTo ( value ) ) ;
396
384
}
385
+
386
+ private static void AssertTaskCompleted ( Task task )
387
+ {
388
+ AssertEqualValue ( ( ) => task . IsCompleted , true , task ) ;
389
+ }
397
390
}
398
391
}
0 commit comments