ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantReadWriteLockTest.java
Revision: 1.70
Committed: Wed Dec 31 20:34:16 2014 UTC (9 years, 4 months ago) by jsr166
Branch: MAIN
Changes since 1.69: +2 -0 lines
Log Message:
add default clause to switch-on-enums

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.12 * Written by Doug Lea with assistance from members of JCP JSR-166
3     * Expert Group and released to the public domain, as explained at
4 jsr166 1.44 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.28 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9 jsr166 1.69 import static java.util.concurrent.TimeUnit.MILLISECONDS;
10    
11     import java.util.Arrays;
12     import java.util.Collection;
13     import java.util.HashSet;
14     import java.util.concurrent.CountDownLatch;
15 jsr166 1.56 import java.util.concurrent.atomic.AtomicBoolean;
16 jsr166 1.65 import java.util.concurrent.locks.Condition;
17     import java.util.concurrent.locks.Lock;
18     import java.util.concurrent.locks.ReentrantReadWriteLock;
19 jsr166 1.69
20     import junit.framework.AssertionFailedError;
21     import junit.framework.Test;
22     import junit.framework.TestSuite;
23 dl 1.1
24 dl 1.3 public class ReentrantReadWriteLockTest extends JSR166TestCase {
25 dl 1.1 public static void main(String[] args) {
26 jsr166 1.41 junit.textui.TestRunner.run(suite());
27 dl 1.1 }
28     public static Test suite() {
29 jsr166 1.35 return new TestSuite(ReentrantReadWriteLockTest.class);
30 dl 1.1 }
31    
32 dl 1.6 /**
33     * A runnable calling lockInterruptibly
34     */
35 jsr166 1.32 class InterruptibleLockRunnable extends CheckedRunnable {
36 dl 1.6 final ReentrantReadWriteLock lock;
37     InterruptibleLockRunnable(ReentrantReadWriteLock l) { lock = l; }
38 jsr166 1.32 public void realRun() throws InterruptedException {
39     lock.writeLock().lockInterruptibly();
40 dl 1.6 }
41     }
42    
43     /**
44     * A runnable calling lockInterruptibly that expects to be
45     * interrupted
46     */
47 jsr166 1.32 class InterruptedLockRunnable extends CheckedInterruptedRunnable {
48 dl 1.6 final ReentrantReadWriteLock lock;
49     InterruptedLockRunnable(ReentrantReadWriteLock l) { lock = l; }
50 jsr166 1.32 public void realRun() throws InterruptedException {
51     lock.writeLock().lockInterruptibly();
52 dl 1.6 }
53     }
54    
55     /**
56     * Subclass to expose protected methods
57     */
58     static class PublicReentrantReadWriteLock extends ReentrantReadWriteLock {
59     PublicReentrantReadWriteLock() { super(); }
60 jsr166 1.58 PublicReentrantReadWriteLock(boolean fair) { super(fair); }
61     public Thread getOwner() {
62     return super.getOwner();
63     }
64 jsr166 1.28 public Collection<Thread> getQueuedThreads() {
65     return super.getQueuedThreads();
66 dl 1.6 }
67 jsr166 1.28 public Collection<Thread> getWaitingThreads(Condition c) {
68     return super.getWaitingThreads(c);
69 dl 1.13 }
70 dl 1.6 }
71    
72     /**
73 jsr166 1.54 * Releases write lock, checking that it had a hold count of 1.
74 jsr166 1.46 */
75 jsr166 1.58 void releaseWriteLock(PublicReentrantReadWriteLock lock) {
76 jsr166 1.54 ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();
77 jsr166 1.61 assertWriteLockedByMoi(lock);
78 jsr166 1.58 assertEquals(1, lock.getWriteHoldCount());
79 jsr166 1.54 writeLock.unlock();
80 jsr166 1.58 assertNotWriteLocked(lock);
81 jsr166 1.46 }
82    
83     /**
84 jsr166 1.56 * Spin-waits until lock.hasQueuedThread(t) becomes true.
85     */
86 jsr166 1.58 void waitForQueuedThread(PublicReentrantReadWriteLock lock, Thread t) {
87 jsr166 1.56 long startTime = System.nanoTime();
88     while (!lock.hasQueuedThread(t)) {
89     if (millisElapsedSince(startTime) > LONG_DELAY_MS)
90 jsr166 1.62 throw new AssertionFailedError("timed out");
91 jsr166 1.56 Thread.yield();
92     }
93 jsr166 1.58 assertTrue(t.isAlive());
94 jsr166 1.67 assertNotSame(t, lock.getOwner());
95 jsr166 1.56 }
96    
97     /**
98     * Checks that lock is not write-locked.
99     */
100 jsr166 1.58 void assertNotWriteLocked(PublicReentrantReadWriteLock lock) {
101 jsr166 1.56 assertFalse(lock.isWriteLocked());
102     assertFalse(lock.isWriteLockedByCurrentThread());
103 jsr166 1.58 assertFalse(lock.writeLock().isHeldByCurrentThread());
104 jsr166 1.61 assertEquals(0, lock.getWriteHoldCount());
105     assertEquals(0, lock.writeLock().getHoldCount());
106 jsr166 1.58 assertNull(lock.getOwner());
107 jsr166 1.56 }
108    
109     /**
110 jsr166 1.58 * Checks that lock is write-locked by the given thread.
111     */
112     void assertWriteLockedBy(PublicReentrantReadWriteLock lock, Thread t) {
113     assertTrue(lock.isWriteLocked());
114     assertSame(t, lock.getOwner());
115     assertEquals(t == Thread.currentThread(),
116     lock.isWriteLockedByCurrentThread());
117     assertEquals(t == Thread.currentThread(),
118     lock.writeLock().isHeldByCurrentThread());
119     assertEquals(t == Thread.currentThread(),
120     lock.getWriteHoldCount() > 0);
121 jsr166 1.61 assertEquals(t == Thread.currentThread(),
122     lock.writeLock().getHoldCount() > 0);
123 jsr166 1.58 assertEquals(0, lock.getReadLockCount());
124     }
125    
126     /**
127 jsr166 1.61 * Checks that lock is write-locked by the current thread.
128     */
129     void assertWriteLockedByMoi(PublicReentrantReadWriteLock lock) {
130     assertWriteLockedBy(lock, Thread.currentThread());
131     }
132    
133     /**
134 jsr166 1.56 * Checks that condition c has no waiters.
135     */
136     void assertHasNoWaiters(PublicReentrantReadWriteLock lock, Condition c) {
137     assertHasWaiters(lock, c, new Thread[] {});
138     }
139    
140     /**
141     * Checks that condition c has exactly the given waiter threads.
142     */
143     void assertHasWaiters(PublicReentrantReadWriteLock lock, Condition c,
144     Thread... threads) {
145     lock.writeLock().lock();
146     assertEquals(threads.length > 0, lock.hasWaiters(c));
147     assertEquals(threads.length, lock.getWaitQueueLength(c));
148     assertEquals(threads.length == 0, lock.getWaitingThreads(c).isEmpty());
149     assertEquals(threads.length, lock.getWaitingThreads(c).size());
150     assertEquals(new HashSet<Thread>(lock.getWaitingThreads(c)),
151     new HashSet<Thread>(Arrays.asList(threads)));
152     lock.writeLock().unlock();
153     }
154    
155 jsr166 1.68 enum AwaitMethod { await, awaitTimed, awaitNanos, awaitUntil }
156 jsr166 1.60
157     /**
158 jsr166 1.61 * Awaits condition using the specified AwaitMethod.
159 jsr166 1.60 */
160     void await(Condition c, AwaitMethod awaitMethod)
161     throws InterruptedException {
162     switch (awaitMethod) {
163     case await:
164     c.await();
165     break;
166 jsr166 1.63 case awaitTimed:
167     assertTrue(c.await(2 * LONG_DELAY_MS, MILLISECONDS));
168     break;
169 jsr166 1.60 case awaitNanos:
170     long nanosRemaining = c.awaitNanos(MILLISECONDS.toNanos(2 * LONG_DELAY_MS));
171     assertTrue(nanosRemaining > 0);
172     break;
173     case awaitUntil:
174     java.util.Date d = new java.util.Date();
175     assertTrue(c.awaitUntil(new java.util.Date(d.getTime() + 2 * LONG_DELAY_MS)));
176     break;
177 jsr166 1.70 default:
178     throw new AssertionError();
179 jsr166 1.60 }
180     }
181    
182 jsr166 1.56 /**
183 dl 1.6 * Constructor sets given fairness, and is in unlocked state
184     */
185 jsr166 1.28 public void testConstructor() {
186 jsr166 1.58 PublicReentrantReadWriteLock lock;
187    
188     lock = new PublicReentrantReadWriteLock();
189     assertFalse(lock.isFair());
190     assertNotWriteLocked(lock);
191     assertEquals(0, lock.getReadLockCount());
192    
193     lock = new PublicReentrantReadWriteLock(true);
194     assertTrue(lock.isFair());
195     assertNotWriteLocked(lock);
196     assertEquals(0, lock.getReadLockCount());
197    
198     lock = new PublicReentrantReadWriteLock(false);
199     assertFalse(lock.isFair());
200     assertNotWriteLocked(lock);
201     assertEquals(0, lock.getReadLockCount());
202 dl 1.6 }
203 dl 1.1
204 dl 1.5 /**
205 dl 1.4 * write-locking and read-locking an unlocked lock succeed
206 dl 1.1 */
207 jsr166 1.60 public void testLock() { testLock(false); }
208     public void testLock_fair() { testLock(true); }
209     public void testLock(boolean fair) {
210     PublicReentrantReadWriteLock lock =
211     new PublicReentrantReadWriteLock(fair);
212 jsr166 1.58 assertNotWriteLocked(lock);
213     lock.writeLock().lock();
214 jsr166 1.61 assertWriteLockedByMoi(lock);
215 jsr166 1.58 lock.writeLock().unlock();
216     assertNotWriteLocked(lock);
217     assertEquals(0, lock.getReadLockCount());
218     lock.readLock().lock();
219     assertNotWriteLocked(lock);
220     assertEquals(1, lock.getReadLockCount());
221     lock.readLock().unlock();
222     assertNotWriteLocked(lock);
223     assertEquals(0, lock.getReadLockCount());
224 dl 1.2 }
225 dl 1.1
226 dl 1.4 /**
227 dl 1.6 * getWriteHoldCount returns number of recursive holds
228     */
229 jsr166 1.60 public void testGetWriteHoldCount() { testGetWriteHoldCount(false); }
230     public void testGetWriteHoldCount_fair() { testGetWriteHoldCount(true); }
231     public void testGetWriteHoldCount(boolean fair) {
232     ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
233 jsr166 1.35 for (int i = 1; i <= SIZE; i++) {
234     lock.writeLock().lock();
235     assertEquals(i,lock.getWriteHoldCount());
236     }
237     for (int i = SIZE; i > 0; i--) {
238     lock.writeLock().unlock();
239     assertEquals(i-1,lock.getWriteHoldCount());
240     }
241 dl 1.6 }
242 dl 1.23
243     /**
244 jsr166 1.60 * writelock.getHoldCount returns number of recursive holds
245 dl 1.25 */
246 jsr166 1.60 public void testGetHoldCount() { testGetHoldCount(false); }
247     public void testGetHoldCount_fair() { testGetHoldCount(true); }
248     public void testGetHoldCount(boolean fair) {
249     ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
250 jsr166 1.35 for (int i = 1; i <= SIZE; i++) {
251     lock.writeLock().lock();
252     assertEquals(i,lock.writeLock().getHoldCount());
253     }
254     for (int i = SIZE; i > 0; i--) {
255     lock.writeLock().unlock();
256     assertEquals(i-1,lock.writeLock().getHoldCount());
257     }
258 dl 1.25 }
259    
260     /**
261 dl 1.23 * getReadHoldCount returns number of recursive holds
262     */
263 jsr166 1.60 public void testGetReadHoldCount() { testGetReadHoldCount(false); }
264     public void testGetReadHoldCount_fair() { testGetReadHoldCount(true); }
265     public void testGetReadHoldCount(boolean fair) {
266     ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
267 jsr166 1.35 for (int i = 1; i <= SIZE; i++) {
268     lock.readLock().lock();
269     assertEquals(i,lock.getReadHoldCount());
270     }
271     for (int i = SIZE; i > 0; i--) {
272     lock.readLock().unlock();
273     assertEquals(i-1,lock.getReadHoldCount());
274     }
275 dl 1.23 }
276 jsr166 1.28
277 dl 1.6 /**
278 dl 1.4 * write-unlocking an unlocked lock throws IllegalMonitorStateException
279     */
280 jsr166 1.60 public void testWriteUnlock_IMSE() { testWriteUnlock_IMSE(false); }
281     public void testWriteUnlock_IMSE_fair() { testWriteUnlock_IMSE(true); }
282     public void testWriteUnlock_IMSE(boolean fair) {
283     ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
284 jsr166 1.35 try {
285 jsr166 1.58 lock.writeLock().unlock();
286 jsr166 1.35 shouldThrow();
287     } catch (IllegalMonitorStateException success) {}
288 dl 1.4 }
289 dl 1.1
290 jsr166 1.56 /**
291     * read-unlocking an unlocked lock throws IllegalMonitorStateException
292     */
293 jsr166 1.60 public void testReadUnlock_IMSE() { testReadUnlock_IMSE(false); }
294     public void testReadUnlock_IMSE_fair() { testReadUnlock_IMSE(true); }
295     public void testReadUnlock_IMSE(boolean fair) {
296     ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
297 jsr166 1.56 try {
298 jsr166 1.58 lock.readLock().unlock();
299 jsr166 1.56 shouldThrow();
300     } catch (IllegalMonitorStateException success) {}
301     }
302 dl 1.1
303 dl 1.4 /**
304     * write-lockInterruptibly is interruptible
305     */
306 jsr166 1.60 public void testWriteLockInterruptibly_Interruptible() { testWriteLockInterruptibly_Interruptible(false); }
307     public void testWriteLockInterruptibly_Interruptible_fair() { testWriteLockInterruptibly_Interruptible(true); }
308     public void testWriteLockInterruptibly_Interruptible(boolean fair) {
309     final PublicReentrantReadWriteLock lock =
310     new PublicReentrantReadWriteLock(fair);
311 jsr166 1.45 lock.writeLock().lock();
312     Thread t = newStartedThread(new CheckedInterruptedRunnable() {
313 jsr166 1.33 public void realRun() throws InterruptedException {
314     lock.writeLock().lockInterruptibly();
315     }});
316 jsr166 1.32
317 jsr166 1.56 waitForQueuedThread(lock, t);
318 jsr166 1.32 t.interrupt();
319 jsr166 1.56 awaitTermination(t);
320 jsr166 1.54 releaseWriteLock(lock);
321 jsr166 1.28 }
322 dl 1.1
323 dl 1.4 /**
324 dl 1.15 * timed write-tryLock is interruptible
325 dl 1.4 */
326 jsr166 1.60 public void testWriteTryLock_Interruptible() { testWriteTryLock_Interruptible(false); }
327     public void testWriteTryLock_Interruptible_fair() { testWriteTryLock_Interruptible(true); }
328     public void testWriteTryLock_Interruptible(boolean fair) {
329     final PublicReentrantReadWriteLock lock =
330     new PublicReentrantReadWriteLock(fair);
331 jsr166 1.35 lock.writeLock().lock();
332 jsr166 1.45 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
333 jsr166 1.33 public void realRun() throws InterruptedException {
334 jsr166 1.59 lock.writeLock().tryLock(2 * LONG_DELAY_MS, MILLISECONDS);
335 jsr166 1.33 }});
336 jsr166 1.32
337 jsr166 1.56 waitForQueuedThread(lock, t);
338 jsr166 1.32 t.interrupt();
339 jsr166 1.56 awaitTermination(t);
340 jsr166 1.54 releaseWriteLock(lock);
341 dl 1.2 }
342    
343 dl 1.4 /**
344     * read-lockInterruptibly is interruptible
345     */
346 jsr166 1.60 public void testReadLockInterruptibly_Interruptible() { testReadLockInterruptibly_Interruptible(false); }
347     public void testReadLockInterruptibly_Interruptible_fair() { testReadLockInterruptibly_Interruptible(true); }
348     public void testReadLockInterruptibly_Interruptible(boolean fair) {
349     final PublicReentrantReadWriteLock lock =
350     new PublicReentrantReadWriteLock(fair);
351 jsr166 1.35 lock.writeLock().lock();
352 jsr166 1.45 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
353 jsr166 1.33 public void realRun() throws InterruptedException {
354     lock.readLock().lockInterruptibly();
355     }});
356 jsr166 1.32
357 jsr166 1.56 waitForQueuedThread(lock, t);
358 jsr166 1.32 t.interrupt();
359 jsr166 1.56 awaitTermination(t);
360 jsr166 1.54 releaseWriteLock(lock);
361 jsr166 1.28 }
362 dl 1.2
363 dl 1.4 /**
364 dl 1.15 * timed read-tryLock is interruptible
365 dl 1.4 */
366 jsr166 1.60 public void testReadTryLock_Interruptible() { testReadTryLock_Interruptible(false); }
367     public void testReadTryLock_Interruptible_fair() { testReadTryLock_Interruptible(true); }
368     public void testReadTryLock_Interruptible(boolean fair) {
369     final PublicReentrantReadWriteLock lock =
370     new PublicReentrantReadWriteLock(fair);
371 jsr166 1.35 lock.writeLock().lock();
372 jsr166 1.45 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
373 jsr166 1.33 public void realRun() throws InterruptedException {
374 jsr166 1.59 lock.readLock().tryLock(2 * LONG_DELAY_MS, MILLISECONDS);
375 jsr166 1.33 }});
376 jsr166 1.32
377 jsr166 1.56 waitForQueuedThread(lock, t);
378 jsr166 1.32 t.interrupt();
379 jsr166 1.56 awaitTermination(t);
380 jsr166 1.54 releaseWriteLock(lock);
381 dl 1.1 }
382    
383 dl 1.4 /**
384 jsr166 1.61 * write-tryLock on an unlocked lock succeeds
385     */
386     public void testWriteTryLock() { testWriteTryLock(false); }
387     public void testWriteTryLock_fair() { testWriteTryLock(true); }
388     public void testWriteTryLock(boolean fair) {
389     final PublicReentrantReadWriteLock lock =
390     new PublicReentrantReadWriteLock(fair);
391     assertTrue(lock.writeLock().tryLock());
392     assertWriteLockedByMoi(lock);
393     assertTrue(lock.writeLock().tryLock());
394     assertWriteLockedByMoi(lock);
395     lock.writeLock().unlock();
396     releaseWriteLock(lock);
397     }
398    
399     /**
400 dl 1.15 * write-tryLock fails if locked
401 dl 1.4 */
402 jsr166 1.60 public void testWriteTryLockWhenLocked() { testWriteTryLockWhenLocked(false); }
403     public void testWriteTryLockWhenLocked_fair() { testWriteTryLockWhenLocked(true); }
404     public void testWriteTryLockWhenLocked(boolean fair) {
405     final PublicReentrantReadWriteLock lock =
406     new PublicReentrantReadWriteLock(fair);
407 jsr166 1.35 lock.writeLock().lock();
408 jsr166 1.45 Thread t = newStartedThread(new CheckedRunnable() {
409 jsr166 1.37 public void realRun() {
410 jsr166 1.42 assertFalse(lock.writeLock().tryLock());
411 jsr166 1.37 }});
412 jsr166 1.32
413 jsr166 1.56 awaitTermination(t);
414 jsr166 1.54 releaseWriteLock(lock);
415 jsr166 1.28 }
416 dl 1.2
417 dl 1.4 /**
418 dl 1.15 * read-tryLock fails if locked
419 dl 1.4 */
420 jsr166 1.60 public void testReadTryLockWhenLocked() { testReadTryLockWhenLocked(false); }
421     public void testReadTryLockWhenLocked_fair() { testReadTryLockWhenLocked(true); }
422     public void testReadTryLockWhenLocked(boolean fair) {
423     final PublicReentrantReadWriteLock lock =
424     new PublicReentrantReadWriteLock(fair);
425 jsr166 1.35 lock.writeLock().lock();
426 jsr166 1.45 Thread t = newStartedThread(new CheckedRunnable() {
427 jsr166 1.37 public void realRun() {
428 jsr166 1.42 assertFalse(lock.readLock().tryLock());
429 jsr166 1.37 }});
430 jsr166 1.32
431 jsr166 1.56 awaitTermination(t);
432 jsr166 1.54 releaseWriteLock(lock);
433 jsr166 1.28 }
434 dl 1.2
435 dl 1.4 /**
436     * Multiple threads can hold a read lock when not write-locked
437     */
438 jsr166 1.60 public void testMultipleReadLocks() { testMultipleReadLocks(false); }
439     public void testMultipleReadLocks_fair() { testMultipleReadLocks(true); }
440     public void testMultipleReadLocks(boolean fair) {
441     final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
442 jsr166 1.35 lock.readLock().lock();
443 jsr166 1.45 Thread t = newStartedThread(new CheckedRunnable() {
444 jsr166 1.60 public void realRun() throws InterruptedException {
445 jsr166 1.42 assertTrue(lock.readLock().tryLock());
446 jsr166 1.37 lock.readLock().unlock();
447 jsr166 1.60 assertTrue(lock.readLock().tryLock(LONG_DELAY_MS, MILLISECONDS));
448     lock.readLock().unlock();
449     lock.readLock().lock();
450     lock.readLock().unlock();
451 jsr166 1.37 }});
452 jsr166 1.32
453 jsr166 1.56 awaitTermination(t);
454 jsr166 1.32 lock.readLock().unlock();
455 jsr166 1.28 }
456 dl 1.2
457 dl 1.4 /**
458 jsr166 1.58 * A writelock succeeds only after a reading thread unlocks
459     */
460 jsr166 1.60 public void testWriteAfterReadLock() { testWriteAfterReadLock(false); }
461     public void testWriteAfterReadLock_fair() { testWriteAfterReadLock(true); }
462     public void testWriteAfterReadLock(boolean fair) {
463     final PublicReentrantReadWriteLock lock =
464     new PublicReentrantReadWriteLock(fair);
465 jsr166 1.58 lock.readLock().lock();
466     Thread t = newStartedThread(new CheckedRunnable() {
467     public void realRun() {
468     assertEquals(1, lock.getReadLockCount());
469     lock.writeLock().lock();
470     assertEquals(0, lock.getReadLockCount());
471     lock.writeLock().unlock();
472     }});
473     waitForQueuedThread(lock, t);
474     assertNotWriteLocked(lock);
475     assertEquals(1, lock.getReadLockCount());
476     lock.readLock().unlock();
477     assertEquals(0, lock.getReadLockCount());
478     awaitTermination(t);
479     assertNotWriteLocked(lock);
480     }
481    
482     /**
483 jsr166 1.56 * A writelock succeeds only after reading threads unlock
484 dl 1.4 */
485 jsr166 1.60 public void testWriteAfterMultipleReadLocks() { testWriteAfterMultipleReadLocks(false); }
486     public void testWriteAfterMultipleReadLocks_fair() { testWriteAfterMultipleReadLocks(true); }
487     public void testWriteAfterMultipleReadLocks(boolean fair) {
488     final PublicReentrantReadWriteLock lock =
489     new PublicReentrantReadWriteLock(fair);
490 jsr166 1.58 lock.readLock().lock();
491 jsr166 1.35 lock.readLock().lock();
492 jsr166 1.45 Thread t1 = newStartedThread(new CheckedRunnable() {
493 jsr166 1.37 public void realRun() {
494     lock.readLock().lock();
495 jsr166 1.58 assertEquals(3, lock.getReadLockCount());
496 jsr166 1.37 lock.readLock().unlock();
497     }});
498 jsr166 1.58 awaitTermination(t1);
499    
500 jsr166 1.45 Thread t2 = newStartedThread(new CheckedRunnable() {
501 jsr166 1.37 public void realRun() {
502 jsr166 1.58 assertEquals(2, lock.getReadLockCount());
503     lock.writeLock().lock();
504     assertEquals(0, lock.getReadLockCount());
505     lock.writeLock().unlock();
506     }});
507     waitForQueuedThread(lock, t2);
508     assertNotWriteLocked(lock);
509     assertEquals(2, lock.getReadLockCount());
510     lock.readLock().unlock();
511     lock.readLock().unlock();
512     assertEquals(0, lock.getReadLockCount());
513     awaitTermination(t2);
514     assertNotWriteLocked(lock);
515     }
516    
517     /**
518     * A thread that tries to acquire a fair read lock (non-reentrantly)
519 jsr166 1.64 * will block if there is a waiting writer thread
520 jsr166 1.58 */
521 jsr166 1.60 public void testReaderWriterReaderFairFifo() {
522     final PublicReentrantReadWriteLock lock =
523     new PublicReentrantReadWriteLock(true);
524 jsr166 1.58 final AtomicBoolean t1GotLock = new AtomicBoolean(false);
525    
526     lock.readLock().lock();
527     Thread t1 = newStartedThread(new CheckedRunnable() {
528     public void realRun() {
529     assertEquals(1, lock.getReadLockCount());
530 jsr166 1.37 lock.writeLock().lock();
531 jsr166 1.58 assertEquals(0, lock.getReadLockCount());
532     t1GotLock.set(true);
533 jsr166 1.37 lock.writeLock().unlock();
534     }});
535 jsr166 1.58 waitForQueuedThread(lock, t1);
536    
537     Thread t2 = newStartedThread(new CheckedRunnable() {
538     public void realRun() {
539     assertEquals(1, lock.getReadLockCount());
540     lock.readLock().lock();
541     assertEquals(1, lock.getReadLockCount());
542     assertTrue(t1GotLock.get());
543     lock.readLock().unlock();
544     }});
545     waitForQueuedThread(lock, t2);
546     assertTrue(t1.isAlive());
547     assertNotWriteLocked(lock);
548     assertEquals(1, lock.getReadLockCount());
549 dl 1.57 lock.readLock().unlock();
550 jsr166 1.56 awaitTermination(t1);
551 dl 1.57 awaitTermination(t2);
552 jsr166 1.56 assertNotWriteLocked(lock);
553 jsr166 1.28 }
554 dl 1.2
555 dl 1.4 /**
556 jsr166 1.56 * Readlocks succeed only after a writing thread unlocks
557 dl 1.4 */
558 jsr166 1.60 public void testReadAfterWriteLock() { testReadAfterWriteLock(false); }
559     public void testReadAfterWriteLock_fair() { testReadAfterWriteLock(true); }
560     public void testReadAfterWriteLock(boolean fair) {
561     final PublicReentrantReadWriteLock lock =
562     new PublicReentrantReadWriteLock(fair);
563 jsr166 1.35 lock.writeLock().lock();
564 jsr166 1.45 Thread t1 = newStartedThread(new CheckedRunnable() {
565 jsr166 1.37 public void realRun() {
566     lock.readLock().lock();
567     lock.readLock().unlock();
568     }});
569 jsr166 1.45 Thread t2 = newStartedThread(new CheckedRunnable() {
570 jsr166 1.37 public void realRun() {
571     lock.readLock().lock();
572     lock.readLock().unlock();
573     }});
574 dl 1.2
575 jsr166 1.56 waitForQueuedThread(lock, t1);
576     waitForQueuedThread(lock, t2);
577 jsr166 1.54 releaseWriteLock(lock);
578 jsr166 1.56 awaitTermination(t1);
579     awaitTermination(t2);
580 jsr166 1.28 }
581 dl 1.2
582 dl 1.20 /**
583     * Read trylock succeeds if write locked by current thread
584     */
585 jsr166 1.60 public void testReadHoldingWriteLock() { testReadHoldingWriteLock(false); }
586     public void testReadHoldingWriteLock_fair() { testReadHoldingWriteLock(true); }
587     public void testReadHoldingWriteLock(boolean fair) {
588     final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
589 jsr166 1.35 lock.writeLock().lock();
590 dl 1.20 assertTrue(lock.readLock().tryLock());
591     lock.readLock().unlock();
592     lock.writeLock().unlock();
593 jsr166 1.28 }
594 dl 1.20
595     /**
596 jsr166 1.64 * Read trylock succeeds (barging) even in the presence of waiting
597     * readers and/or writers
598 dl 1.20 */
599 jsr166 1.60 public void testReadTryLockBarging() { testReadTryLockBarging(false); }
600     public void testReadTryLockBarging_fair() { testReadTryLockBarging(true); }
601     public void testReadTryLockBarging(boolean fair) {
602     final PublicReentrantReadWriteLock lock =
603     new PublicReentrantReadWriteLock(fair);
604 jsr166 1.56 lock.readLock().lock();
605    
606 jsr166 1.45 Thread t1 = newStartedThread(new CheckedRunnable() {
607 jsr166 1.37 public void realRun() {
608 jsr166 1.60 lock.writeLock().lock();
609     lock.writeLock().unlock();
610 jsr166 1.37 }});
611 jsr166 1.60
612     waitForQueuedThread(lock, t1);
613    
614 jsr166 1.45 Thread t2 = newStartedThread(new CheckedRunnable() {
615 jsr166 1.37 public void realRun() {
616     lock.readLock().lock();
617     lock.readLock().unlock();
618     }});
619 dl 1.20
620 jsr166 1.60 if (fair)
621     waitForQueuedThread(lock, t2);
622 dl 1.20
623 jsr166 1.60 Thread t3 = newStartedThread(new CheckedRunnable() {
624 jsr166 1.37 public void realRun() {
625 jsr166 1.60 lock.readLock().tryLock();
626     lock.readLock().unlock();
627 jsr166 1.37 }});
628 dl 1.23
629 jsr166 1.60 assertTrue(lock.getReadLockCount() > 0);
630     awaitTermination(t3);
631     assertTrue(t1.isAlive());
632     if (fair) assertTrue(t2.isAlive());
633 jsr166 1.32 lock.readLock().unlock();
634 jsr166 1.56 awaitTermination(t1);
635     awaitTermination(t2);
636 jsr166 1.28 }
637 dl 1.23
638     /**
639 jsr166 1.60 * Read lock succeeds if write locked by current thread even if
640 dl 1.23 * other threads are waiting for readlock
641 dl 1.20 */
642 jsr166 1.60 public void testReadHoldingWriteLock2() { testReadHoldingWriteLock2(false); }
643     public void testReadHoldingWriteLock2_fair() { testReadHoldingWriteLock2(true); }
644     public void testReadHoldingWriteLock2(boolean fair) {
645     final PublicReentrantReadWriteLock lock =
646     new PublicReentrantReadWriteLock(fair);
647 jsr166 1.35 lock.writeLock().lock();
648 jsr166 1.56 lock.readLock().lock();
649     lock.readLock().unlock();
650    
651 jsr166 1.45 Thread t1 = newStartedThread(new CheckedRunnable() {
652 jsr166 1.37 public void realRun() {
653     lock.readLock().lock();
654     lock.readLock().unlock();
655     }});
656 jsr166 1.45 Thread t2 = newStartedThread(new CheckedRunnable() {
657 jsr166 1.37 public void realRun() {
658     lock.readLock().lock();
659     lock.readLock().unlock();
660     }});
661 dl 1.20
662 jsr166 1.56 waitForQueuedThread(lock, t1);
663     waitForQueuedThread(lock, t2);
664 jsr166 1.61 assertWriteLockedByMoi(lock);
665 jsr166 1.32 lock.readLock().lock();
666     lock.readLock().unlock();
667 jsr166 1.56 releaseWriteLock(lock);
668     awaitTermination(t1);
669     awaitTermination(t2);
670 jsr166 1.28 }
671 dl 1.20
672 dl 1.4 /**
673 jsr166 1.60 * Read lock succeeds if write locked by current thread even if
674 dl 1.23 * other threads are waiting for writelock
675     */
676 jsr166 1.60 public void testReadHoldingWriteLock3() { testReadHoldingWriteLock3(false); }
677     public void testReadHoldingWriteLock3_fair() { testReadHoldingWriteLock3(true); }
678     public void testReadHoldingWriteLock3(boolean fair) {
679     final PublicReentrantReadWriteLock lock =
680     new PublicReentrantReadWriteLock(fair);
681 jsr166 1.35 lock.writeLock().lock();
682 jsr166 1.56 lock.readLock().lock();
683     lock.readLock().unlock();
684    
685 jsr166 1.45 Thread t1 = newStartedThread(new CheckedRunnable() {
686 jsr166 1.37 public void realRun() {
687     lock.writeLock().lock();
688     lock.writeLock().unlock();
689     }});
690 jsr166 1.45 Thread t2 = newStartedThread(new CheckedRunnable() {
691 jsr166 1.37 public void realRun() {
692     lock.writeLock().lock();
693     lock.writeLock().unlock();
694     }});
695 dl 1.23
696 jsr166 1.56 waitForQueuedThread(lock, t1);
697     waitForQueuedThread(lock, t2);
698 jsr166 1.61 assertWriteLockedByMoi(lock);
699 jsr166 1.32 lock.readLock().lock();
700     lock.readLock().unlock();
701 jsr166 1.61 assertWriteLockedByMoi(lock);
702 jsr166 1.60 lock.writeLock().unlock();
703 jsr166 1.56 awaitTermination(t1);
704     awaitTermination(t2);
705 jsr166 1.28 }
706 dl 1.23
707     /**
708 jsr166 1.60 * Write lock succeeds if write locked by current thread even if
709 dl 1.23 * other threads are waiting for writelock
710     */
711 jsr166 1.60 public void testWriteHoldingWriteLock4() { testWriteHoldingWriteLock4(false); }
712     public void testWriteHoldingWriteLock4_fair() { testWriteHoldingWriteLock4(true); }
713     public void testWriteHoldingWriteLock4(boolean fair) {
714     final PublicReentrantReadWriteLock lock =
715     new PublicReentrantReadWriteLock(fair);
716 jsr166 1.35 lock.writeLock().lock();
717 jsr166 1.60 lock.writeLock().lock();
718     lock.writeLock().unlock();
719    
720 jsr166 1.45 Thread t1 = newStartedThread(new CheckedRunnable() {
721 jsr166 1.37 public void realRun() {
722     lock.writeLock().lock();
723     lock.writeLock().unlock();
724     }});
725 jsr166 1.45 Thread t2 = newStartedThread(new CheckedRunnable() {
726 jsr166 1.37 public void realRun() {
727     lock.writeLock().lock();
728     lock.writeLock().unlock();
729     }});
730 dl 1.23
731 jsr166 1.56 waitForQueuedThread(lock, t1);
732     waitForQueuedThread(lock, t2);
733 jsr166 1.61 assertWriteLockedByMoi(lock);
734 jsr166 1.42 assertEquals(1, lock.getWriteHoldCount());
735 jsr166 1.32 lock.writeLock().lock();
736 jsr166 1.61 assertWriteLockedByMoi(lock);
737 jsr166 1.42 assertEquals(2, lock.getWriteHoldCount());
738 jsr166 1.32 lock.writeLock().unlock();
739 jsr166 1.61 assertWriteLockedByMoi(lock);
740 jsr166 1.60 assertEquals(1, lock.getWriteHoldCount());
741 jsr166 1.32 lock.writeLock().unlock();
742 jsr166 1.56 awaitTermination(t1);
743     awaitTermination(t2);
744 jsr166 1.28 }
745 dl 1.23
746     /**
747 dl 1.15 * Read tryLock succeeds if readlocked but not writelocked
748 dl 1.4 */
749 jsr166 1.60 public void testTryLockWhenReadLocked() { testTryLockWhenReadLocked(false); }
750     public void testTryLockWhenReadLocked_fair() { testTryLockWhenReadLocked(true); }
751     public void testTryLockWhenReadLocked(boolean fair) {
752     final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
753 jsr166 1.35 lock.readLock().lock();
754 jsr166 1.45 Thread t = newStartedThread(new CheckedRunnable() {
755 jsr166 1.37 public void realRun() {
756 jsr166 1.42 assertTrue(lock.readLock().tryLock());
757 jsr166 1.37 lock.readLock().unlock();
758     }});
759 jsr166 1.32
760 jsr166 1.56 awaitTermination(t);
761 jsr166 1.32 lock.readLock().unlock();
762 jsr166 1.28 }
763    
764 dl 1.4 /**
765 dl 1.15 * write tryLock fails when readlocked
766 dl 1.4 */
767 jsr166 1.60 public void testWriteTryLockWhenReadLocked() { testWriteTryLockWhenReadLocked(false); }
768     public void testWriteTryLockWhenReadLocked_fair() { testWriteTryLockWhenReadLocked(true); }
769     public void testWriteTryLockWhenReadLocked(boolean fair) {
770     final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
771 jsr166 1.35 lock.readLock().lock();
772 jsr166 1.45 Thread t = newStartedThread(new CheckedRunnable() {
773 jsr166 1.37 public void realRun() {
774 jsr166 1.42 assertFalse(lock.writeLock().tryLock());
775 jsr166 1.37 }});
776 jsr166 1.32
777 jsr166 1.56 awaitTermination(t);
778 jsr166 1.32 lock.readLock().unlock();
779 jsr166 1.28 }
780    
781 dl 1.4 /**
782 dl 1.15 * write timed tryLock times out if locked
783 dl 1.4 */
784 jsr166 1.60 public void testWriteTryLock_Timeout() { testWriteTryLock_Timeout(false); }
785     public void testWriteTryLock_Timeout_fair() { testWriteTryLock_Timeout(true); }
786     public void testWriteTryLock_Timeout(boolean fair) {
787 jsr166 1.61 final PublicReentrantReadWriteLock lock =
788     new PublicReentrantReadWriteLock(fair);
789 jsr166 1.35 lock.writeLock().lock();
790 jsr166 1.45 Thread t = newStartedThread(new CheckedRunnable() {
791 jsr166 1.33 public void realRun() throws InterruptedException {
792 jsr166 1.59 long startTime = System.nanoTime();
793     long timeoutMillis = 10;
794     assertFalse(lock.writeLock().tryLock(timeoutMillis, MILLISECONDS));
795     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
796 jsr166 1.33 }});
797 jsr166 1.32
798 jsr166 1.56 awaitTermination(t);
799 jsr166 1.61 releaseWriteLock(lock);
800 jsr166 1.28 }
801 dl 1.2
802 dl 1.4 /**
803 dl 1.15 * read timed tryLock times out if write-locked
804 dl 1.4 */
805 jsr166 1.60 public void testReadTryLock_Timeout() { testReadTryLock_Timeout(false); }
806     public void testReadTryLock_Timeout_fair() { testReadTryLock_Timeout(true); }
807     public void testReadTryLock_Timeout(boolean fair) {
808     final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
809 jsr166 1.35 lock.writeLock().lock();
810 jsr166 1.45 Thread t = newStartedThread(new CheckedRunnable() {
811 jsr166 1.33 public void realRun() throws InterruptedException {
812 jsr166 1.59 long startTime = System.nanoTime();
813     long timeoutMillis = 10;
814     assertFalse(lock.readLock().tryLock(timeoutMillis, MILLISECONDS));
815     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
816 jsr166 1.33 }});
817 jsr166 1.32
818 jsr166 1.56 awaitTermination(t);
819 jsr166 1.34 assertTrue(lock.writeLock().isHeldByCurrentThread());
820 jsr166 1.32 lock.writeLock().unlock();
821 jsr166 1.28 }
822 dl 1.2
823 dl 1.4 /**
824 jsr166 1.61 * write lockInterruptibly succeeds if unlocked, else is interruptible
825 dl 1.4 */
826 jsr166 1.60 public void testWriteLockInterruptibly() { testWriteLockInterruptibly(false); }
827     public void testWriteLockInterruptibly_fair() { testWriteLockInterruptibly(true); }
828     public void testWriteLockInterruptibly(boolean fair) {
829     final PublicReentrantReadWriteLock lock =
830     new PublicReentrantReadWriteLock(fair);
831     try {
832     lock.writeLock().lockInterruptibly();
833 jsr166 1.61 } catch (InterruptedException ie) {
834     threadUnexpectedException(ie);
835 jsr166 1.60 }
836 jsr166 1.45 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
837 jsr166 1.33 public void realRun() throws InterruptedException {
838     lock.writeLock().lockInterruptibly();
839     }});
840 jsr166 1.32
841 jsr166 1.56 waitForQueuedThread(lock, t);
842 jsr166 1.32 t.interrupt();
843 jsr166 1.61 assertTrue(lock.writeLock().isHeldByCurrentThread());
844 jsr166 1.56 awaitTermination(t);
845 jsr166 1.54 releaseWriteLock(lock);
846 dl 1.2 }
847    
848 dl 1.4 /**
849 jsr166 1.43 * read lockInterruptibly succeeds if lock free else is interruptible
850 dl 1.4 */
851 jsr166 1.60 public void testReadLockInterruptibly() { testReadLockInterruptibly(false); }
852     public void testReadLockInterruptibly_fair() { testReadLockInterruptibly(true); }
853     public void testReadLockInterruptibly(boolean fair) {
854     final PublicReentrantReadWriteLock lock =
855     new PublicReentrantReadWriteLock(fair);
856     try {
857     lock.readLock().lockInterruptibly();
858     lock.readLock().unlock();
859     lock.writeLock().lockInterruptibly();
860 jsr166 1.61 } catch (InterruptedException ie) {
861     threadUnexpectedException(ie);
862 jsr166 1.60 }
863 jsr166 1.45 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
864 jsr166 1.33 public void realRun() throws InterruptedException {
865     lock.readLock().lockInterruptibly();
866     }});
867 jsr166 1.32
868 jsr166 1.56 waitForQueuedThread(lock, t);
869 jsr166 1.32 t.interrupt();
870 jsr166 1.56 awaitTermination(t);
871 jsr166 1.54 releaseWriteLock(lock);
872 dl 1.2 }
873    
874 dl 1.4 /**
875     * Calling await without holding lock throws IllegalMonitorStateException
876     */
877 jsr166 1.60 public void testAwait_IMSE() { testAwait_IMSE(false); }
878     public void testAwait_IMSE_fair() { testAwait_IMSE(true); }
879     public void testAwait_IMSE(boolean fair) {
880     final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
881 dl 1.2 final Condition c = lock.writeLock().newCondition();
882 jsr166 1.63 for (AwaitMethod awaitMethod : AwaitMethod.values()) {
883     long startTime = System.nanoTime();
884 jsr166 1.60 try {
885 jsr166 1.63 await(c, awaitMethod);
886 jsr166 1.60 shouldThrow();
887 jsr166 1.63 } catch (IllegalMonitorStateException success) {
888     } catch (InterruptedException e) { threadUnexpectedException(e); }
889     assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
890 jsr166 1.60 }
891 dl 1.2 }
892    
893 dl 1.4 /**
894     * Calling signal without holding lock throws IllegalMonitorStateException
895     */
896 jsr166 1.60 public void testSignal_IMSE() { testSignal_IMSE(false); }
897     public void testSignal_IMSE_fair() { testSignal_IMSE(true); }
898     public void testSignal_IMSE(boolean fair) {
899     final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
900 dl 1.2 final Condition c = lock.writeLock().newCondition();
901     try {
902     c.signal();
903 dl 1.4 shouldThrow();
904 jsr166 1.32 } catch (IllegalMonitorStateException success) {}
905 dl 1.2 }
906    
907 dl 1.4 /**
908 jsr166 1.56 * Calling signalAll without holding lock throws IllegalMonitorStateException
909     */
910 jsr166 1.60 public void testSignalAll_IMSE() { testSignalAll_IMSE(false); }
911     public void testSignalAll_IMSE_fair() { testSignalAll_IMSE(true); }
912     public void testSignalAll_IMSE(boolean fair) {
913     final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
914 jsr166 1.56 final Condition c = lock.writeLock().newCondition();
915     try {
916     c.signalAll();
917     shouldThrow();
918     } catch (IllegalMonitorStateException success) {}
919     }
920    
921     /**
922 dl 1.4 * awaitNanos without a signal times out
923     */
924 jsr166 1.60 public void testAwaitNanos_Timeout() { testAwaitNanos_Timeout(false); }
925     public void testAwaitNanos_Timeout_fair() { testAwaitNanos_Timeout(true); }
926     public void testAwaitNanos_Timeout(boolean fair) {
927     try {
928     final ReentrantReadWriteLock lock =
929     new ReentrantReadWriteLock(fair);
930     final Condition c = lock.writeLock().newCondition();
931     lock.writeLock().lock();
932     long startTime = System.nanoTime();
933     long timeoutMillis = 10;
934     long timeoutNanos = MILLISECONDS.toNanos(timeoutMillis);
935     long nanosRemaining = c.awaitNanos(timeoutNanos);
936     assertTrue(nanosRemaining <= 0);
937     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
938     lock.writeLock().unlock();
939     } catch (InterruptedException e) {
940     threadUnexpectedException(e);
941     }
942 dl 1.2 }
943    
944 dl 1.4 /**
945 jsr166 1.43 * timed await without a signal times out
946 dl 1.4 */
947 jsr166 1.60 public void testAwait_Timeout() { testAwait_Timeout(false); }
948     public void testAwait_Timeout_fair() { testAwait_Timeout(true); }
949     public void testAwait_Timeout(boolean fair) {
950     try {
951     final ReentrantReadWriteLock lock =
952     new ReentrantReadWriteLock(fair);
953     final Condition c = lock.writeLock().newCondition();
954     lock.writeLock().lock();
955     long startTime = System.nanoTime();
956     long timeoutMillis = 10;
957     assertFalse(c.await(timeoutMillis, MILLISECONDS));
958     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
959     lock.writeLock().unlock();
960     } catch (InterruptedException e) {
961     threadUnexpectedException(e);
962     }
963 dl 1.2 }
964    
965 dl 1.4 /**
966     * awaitUntil without a signal times out
967     */
968 jsr166 1.60 public void testAwaitUntil_Timeout() { testAwaitUntil_Timeout(false); }
969     public void testAwaitUntil_Timeout_fair() { testAwaitUntil_Timeout(true); }
970     public void testAwaitUntil_Timeout(boolean fair) {
971     try {
972     final ReentrantReadWriteLock lock =
973     new ReentrantReadWriteLock(fair);
974     final Condition c = lock.writeLock().newCondition();
975     lock.writeLock().lock();
976     long startTime = System.nanoTime();
977     long timeoutMillis = 10;
978     java.util.Date d = new java.util.Date();
979     assertFalse(c.awaitUntil(new java.util.Date(d.getTime() + timeoutMillis)));
980     assertTrue(millisElapsedSince(startTime) >= timeoutMillis);
981     lock.writeLock().unlock();
982     } catch (InterruptedException e) {
983     threadUnexpectedException(e);
984     }
985 dl 1.2 }
986 dl 1.1
987 dl 1.4 /**
988     * await returns when signalled
989     */
990 jsr166 1.60 public void testAwait() { testAwait(false); }
991     public void testAwait_fair() { testAwait(true); }
992     public void testAwait(boolean fair) {
993     final PublicReentrantReadWriteLock lock =
994     new PublicReentrantReadWriteLock(fair);
995 dl 1.2 final Condition c = lock.writeLock().newCondition();
996 jsr166 1.56 final CountDownLatch locked = new CountDownLatch(1);
997 jsr166 1.45 Thread t = newStartedThread(new CheckedRunnable() {
998 jsr166 1.33 public void realRun() throws InterruptedException {
999     lock.writeLock().lock();
1000 jsr166 1.56 locked.countDown();
1001 jsr166 1.33 c.await();
1002     lock.writeLock().unlock();
1003     }});
1004 dl 1.2
1005 jsr166 1.60 await(locked);
1006 jsr166 1.32 lock.writeLock().lock();
1007 jsr166 1.59 assertHasWaiters(lock, c, t);
1008 jsr166 1.32 c.signal();
1009 jsr166 1.59 assertHasNoWaiters(lock, c);
1010 jsr166 1.56 assertTrue(t.isAlive());
1011 jsr166 1.32 lock.writeLock().unlock();
1012 jsr166 1.56 awaitTermination(t);
1013 dl 1.22 }
1014    
1015 dl 1.4 /**
1016 jsr166 1.66 * awaitUninterruptibly is uninterruptible
1017 dl 1.4 */
1018 jsr166 1.60 public void testAwaitUninterruptibly() { testAwaitUninterruptibly(false); }
1019     public void testAwaitUninterruptibly_fair() { testAwaitUninterruptibly(true); }
1020     public void testAwaitUninterruptibly(boolean fair) {
1021     final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1022 dl 1.2 final Condition c = lock.writeLock().newCondition();
1023 jsr166 1.66 final CountDownLatch pleaseInterrupt = new CountDownLatch(2);
1024    
1025     Thread t1 = newStartedThread(new CheckedRunnable() {
1026     public void realRun() {
1027     // Interrupt before awaitUninterruptibly
1028     lock.writeLock().lock();
1029     pleaseInterrupt.countDown();
1030     Thread.currentThread().interrupt();
1031     c.awaitUninterruptibly();
1032     assertTrue(Thread.interrupted());
1033     lock.writeLock().unlock();
1034     }});
1035    
1036     Thread t2 = newStartedThread(new CheckedRunnable() {
1037 jsr166 1.56 public void realRun() {
1038 jsr166 1.66 // Interrupt during awaitUninterruptibly
1039 jsr166 1.56 lock.writeLock().lock();
1040 jsr166 1.66 pleaseInterrupt.countDown();
1041 jsr166 1.56 c.awaitUninterruptibly();
1042     assertTrue(Thread.interrupted());
1043     lock.writeLock().unlock();
1044     }});
1045 dl 1.22
1046 jsr166 1.66 await(pleaseInterrupt);
1047 jsr166 1.56 lock.writeLock().lock();
1048     lock.writeLock().unlock();
1049 jsr166 1.66 t2.interrupt();
1050    
1051     assertThreadStaysAlive(t1);
1052     assertTrue(t2.isAlive());
1053    
1054 jsr166 1.32 lock.writeLock().lock();
1055 jsr166 1.66 c.signalAll();
1056 jsr166 1.56 lock.writeLock().unlock();
1057 jsr166 1.66
1058     awaitTermination(t1);
1059     awaitTermination(t2);
1060 dl 1.2 }
1061    
1062 dl 1.4 /**
1063 jsr166 1.60 * await/awaitNanos/awaitUntil is interruptible
1064 dl 1.4 */
1065 jsr166 1.60 public void testInterruptible_await() { testInterruptible(false, AwaitMethod.await); }
1066     public void testInterruptible_await_fair() { testInterruptible(true, AwaitMethod.await); }
1067 jsr166 1.63 public void testInterruptible_awaitTimed() { testInterruptible(false, AwaitMethod.awaitTimed); }
1068     public void testInterruptible_awaitTimed_fair() { testInterruptible(true, AwaitMethod.awaitTimed); }
1069 jsr166 1.60 public void testInterruptible_awaitNanos() { testInterruptible(false, AwaitMethod.awaitNanos); }
1070     public void testInterruptible_awaitNanos_fair() { testInterruptible(true, AwaitMethod.awaitNanos); }
1071     public void testInterruptible_awaitUntil() { testInterruptible(false, AwaitMethod.awaitUntil); }
1072     public void testInterruptible_awaitUntil_fair() { testInterruptible(true, AwaitMethod.awaitUntil); }
1073     public void testInterruptible(boolean fair, final AwaitMethod awaitMethod) {
1074     final PublicReentrantReadWriteLock lock =
1075     new PublicReentrantReadWriteLock(fair);
1076 dl 1.2 final Condition c = lock.writeLock().newCondition();
1077 jsr166 1.52 final CountDownLatch locked = new CountDownLatch(1);
1078 jsr166 1.45 Thread t = newStartedThread(new CheckedInterruptedRunnable() {
1079 jsr166 1.33 public void realRun() throws InterruptedException {
1080     lock.writeLock().lock();
1081 jsr166 1.61 assertWriteLockedByMoi(lock);
1082 jsr166 1.56 assertHasNoWaiters(lock, c);
1083 jsr166 1.52 locked.countDown();
1084 jsr166 1.56 try {
1085 jsr166 1.60 await(c, awaitMethod);
1086 jsr166 1.56 } finally {
1087 jsr166 1.61 assertWriteLockedByMoi(lock);
1088 jsr166 1.56 assertHasNoWaiters(lock, c);
1089     lock.writeLock().unlock();
1090     assertFalse(Thread.interrupted());
1091     }
1092 jsr166 1.33 }});
1093 dl 1.2
1094 jsr166 1.60 await(locked);
1095 jsr166 1.56 assertHasWaiters(lock, c, t);
1096 jsr166 1.32 t.interrupt();
1097 jsr166 1.56 awaitTermination(t);
1098 jsr166 1.58 assertNotWriteLocked(lock);
1099 dl 1.2 }
1100    
1101 dl 1.4 /**
1102     * signalAll wakes up all threads
1103     */
1104 jsr166 1.60 public void testSignalAll_await() { testSignalAll(false, AwaitMethod.await); }
1105     public void testSignalAll_await_fair() { testSignalAll(true, AwaitMethod.await); }
1106 jsr166 1.63 public void testSignalAll_awaitTimed() { testSignalAll(false, AwaitMethod.awaitTimed); }
1107     public void testSignalAll_awaitTimed_fair() { testSignalAll(true, AwaitMethod.awaitTimed); }
1108 jsr166 1.60 public void testSignalAll_awaitNanos() { testSignalAll(false, AwaitMethod.awaitNanos); }
1109     public void testSignalAll_awaitNanos_fair() { testSignalAll(true, AwaitMethod.awaitNanos); }
1110     public void testSignalAll_awaitUntil() { testSignalAll(false, AwaitMethod.awaitUntil); }
1111     public void testSignalAll_awaitUntil_fair() { testSignalAll(true, AwaitMethod.awaitUntil); }
1112     public void testSignalAll(boolean fair, final AwaitMethod awaitMethod) {
1113     final PublicReentrantReadWriteLock lock =
1114     new PublicReentrantReadWriteLock(fair);
1115 dl 1.2 final Condition c = lock.writeLock().newCondition();
1116 jsr166 1.56 final CountDownLatch locked = new CountDownLatch(2);
1117     final Lock writeLock = lock.writeLock();
1118 jsr166 1.60 class Awaiter extends CheckedRunnable {
1119 jsr166 1.33 public void realRun() throws InterruptedException {
1120 jsr166 1.56 writeLock.lock();
1121     locked.countDown();
1122 jsr166 1.60 await(c, awaitMethod);
1123 jsr166 1.56 writeLock.unlock();
1124 jsr166 1.60 }
1125     }
1126 jsr166 1.33
1127 jsr166 1.60 Thread t1 = newStartedThread(new Awaiter());
1128     Thread t2 = newStartedThread(new Awaiter());
1129 dl 1.2
1130 jsr166 1.60 await(locked);
1131 jsr166 1.56 writeLock.lock();
1132     assertHasWaiters(lock, c, t1, t2);
1133 jsr166 1.32 c.signalAll();
1134 jsr166 1.56 assertHasNoWaiters(lock, c);
1135     writeLock.unlock();
1136     awaitTermination(t1);
1137     awaitTermination(t2);
1138     }
1139    
1140     /**
1141 jsr166 1.64 * signal wakes up waiting threads in FIFO order
1142 jsr166 1.56 */
1143 jsr166 1.60 public void testSignalWakesFifo() { testSignalWakesFifo(false); }
1144     public void testSignalWakesFifo_fair() { testSignalWakesFifo(true); }
1145     public void testSignalWakesFifo(boolean fair) {
1146     final PublicReentrantReadWriteLock lock =
1147     new PublicReentrantReadWriteLock(fair);
1148 jsr166 1.56 final Condition c = lock.writeLock().newCondition();
1149     final CountDownLatch locked1 = new CountDownLatch(1);
1150     final CountDownLatch locked2 = new CountDownLatch(1);
1151     final Lock writeLock = lock.writeLock();
1152     Thread t1 = newStartedThread(new CheckedRunnable() {
1153     public void realRun() throws InterruptedException {
1154     writeLock.lock();
1155     locked1.countDown();
1156     c.await();
1157     writeLock.unlock();
1158     }});
1159    
1160 jsr166 1.60 await(locked1);
1161 jsr166 1.56
1162     Thread t2 = newStartedThread(new CheckedRunnable() {
1163     public void realRun() throws InterruptedException {
1164     writeLock.lock();
1165     locked2.countDown();
1166     c.await();
1167     writeLock.unlock();
1168     }});
1169    
1170 jsr166 1.60 await(locked2);
1171 jsr166 1.56
1172     writeLock.lock();
1173     assertHasWaiters(lock, c, t1, t2);
1174     assertFalse(lock.hasQueuedThreads());
1175     c.signal();
1176     assertHasWaiters(lock, c, t2);
1177     assertTrue(lock.hasQueuedThread(t1));
1178     assertFalse(lock.hasQueuedThread(t2));
1179     c.signal();
1180     assertHasNoWaiters(lock, c);
1181     assertTrue(lock.hasQueuedThread(t1));
1182     assertTrue(lock.hasQueuedThread(t2));
1183     writeLock.unlock();
1184     awaitTermination(t1);
1185     awaitTermination(t2);
1186 dl 1.2 }
1187    
1188 dl 1.4 /**
1189 jsr166 1.59 * await after multiple reentrant locking preserves lock count
1190     */
1191 jsr166 1.60 public void testAwaitLockCount() { testAwaitLockCount(false); }
1192     public void testAwaitLockCount_fair() { testAwaitLockCount(true); }
1193     public void testAwaitLockCount(boolean fair) {
1194     final PublicReentrantReadWriteLock lock =
1195     new PublicReentrantReadWriteLock(fair);
1196 jsr166 1.59 final Condition c = lock.writeLock().newCondition();
1197     final CountDownLatch locked = new CountDownLatch(2);
1198     Thread t1 = newStartedThread(new CheckedRunnable() {
1199     public void realRun() throws InterruptedException {
1200     lock.writeLock().lock();
1201 jsr166 1.61 assertWriteLockedByMoi(lock);
1202 jsr166 1.59 assertEquals(1, lock.writeLock().getHoldCount());
1203     locked.countDown();
1204     c.await();
1205 jsr166 1.61 assertWriteLockedByMoi(lock);
1206 jsr166 1.59 assertEquals(1, lock.writeLock().getHoldCount());
1207     lock.writeLock().unlock();
1208     }});
1209    
1210     Thread t2 = newStartedThread(new CheckedRunnable() {
1211     public void realRun() throws InterruptedException {
1212     lock.writeLock().lock();
1213     lock.writeLock().lock();
1214 jsr166 1.61 assertWriteLockedByMoi(lock);
1215 jsr166 1.59 assertEquals(2, lock.writeLock().getHoldCount());
1216     locked.countDown();
1217     c.await();
1218 jsr166 1.61 assertWriteLockedByMoi(lock);
1219 jsr166 1.59 assertEquals(2, lock.writeLock().getHoldCount());
1220     lock.writeLock().unlock();
1221     lock.writeLock().unlock();
1222     }});
1223    
1224 jsr166 1.60 await(locked);
1225 jsr166 1.59 lock.writeLock().lock();
1226     assertHasWaiters(lock, c, t1, t2);
1227     c.signalAll();
1228     assertHasNoWaiters(lock, c);
1229     lock.writeLock().unlock();
1230     awaitTermination(t1);
1231     awaitTermination(t2);
1232     }
1233    
1234     /**
1235 dl 1.4 * A serialized lock deserializes as unlocked
1236     */
1237 jsr166 1.60 public void testSerialization() { testSerialization(false); }
1238     public void testSerialization_fair() { testSerialization(true); }
1239     public void testSerialization(boolean fair) {
1240     ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1241     lock.writeLock().lock();
1242     lock.readLock().lock();
1243    
1244     ReentrantReadWriteLock clone = serialClone(lock);
1245     assertEquals(lock.isFair(), clone.isFair());
1246     assertTrue(lock.isWriteLocked());
1247     assertFalse(clone.isWriteLocked());
1248     assertEquals(1, lock.getReadLockCount());
1249     assertEquals(0, clone.getReadLockCount());
1250     clone.writeLock().lock();
1251     clone.readLock().lock();
1252     assertTrue(clone.isWriteLocked());
1253     assertEquals(1, clone.getReadLockCount());
1254     clone.readLock().unlock();
1255     clone.writeLock().unlock();
1256 jsr166 1.61 assertFalse(clone.isWriteLocked());
1257     assertEquals(1, lock.getReadLockCount());
1258     assertEquals(0, clone.getReadLockCount());
1259 dl 1.1 }
1260 dl 1.2
1261 dl 1.6 /**
1262 dl 1.13 * hasQueuedThreads reports whether there are waiting threads
1263     */
1264 jsr166 1.60 public void testHasQueuedThreads() { testHasQueuedThreads(false); }
1265     public void testHasQueuedThreads_fair() { testHasQueuedThreads(true); }
1266     public void testHasQueuedThreads(boolean fair) {
1267     final PublicReentrantReadWriteLock lock =
1268     new PublicReentrantReadWriteLock(fair);
1269 dl 1.13 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1270     Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1271 jsr166 1.32 assertFalse(lock.hasQueuedThreads());
1272     lock.writeLock().lock();
1273 jsr166 1.56 assertFalse(lock.hasQueuedThreads());
1274 jsr166 1.32 t1.start();
1275 jsr166 1.56 waitForQueuedThread(lock, t1);
1276 jsr166 1.59 assertTrue(lock.hasQueuedThreads());
1277 jsr166 1.32 t2.start();
1278 jsr166 1.56 waitForQueuedThread(lock, t2);
1279 jsr166 1.32 assertTrue(lock.hasQueuedThreads());
1280     t1.interrupt();
1281 jsr166 1.56 awaitTermination(t1);
1282 jsr166 1.32 assertTrue(lock.hasQueuedThreads());
1283     lock.writeLock().unlock();
1284 jsr166 1.56 awaitTermination(t2);
1285 jsr166 1.32 assertFalse(lock.hasQueuedThreads());
1286 jsr166 1.28 }
1287 dl 1.13
1288     /**
1289 dl 1.19 * hasQueuedThread(null) throws NPE
1290     */
1291 jsr166 1.60 public void testHasQueuedThreadNPE() { testHasQueuedThreadNPE(false); }
1292     public void testHasQueuedThreadNPE_fair() { testHasQueuedThreadNPE(true); }
1293     public void testHasQueuedThreadNPE(boolean fair) {
1294     final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1295 dl 1.19 try {
1296 jsr166 1.59 lock.hasQueuedThread(null);
1297 dl 1.19 shouldThrow();
1298 jsr166 1.33 } catch (NullPointerException success) {}
1299 dl 1.19 }
1300    
1301     /**
1302 jsr166 1.64 * hasQueuedThread reports whether a thread is queued
1303 dl 1.19 */
1304 jsr166 1.60 public void testHasQueuedThread() { testHasQueuedThread(false); }
1305     public void testHasQueuedThread_fair() { testHasQueuedThread(true); }
1306     public void testHasQueuedThread(boolean fair) {
1307     final PublicReentrantReadWriteLock lock =
1308     new PublicReentrantReadWriteLock(fair);
1309 jsr166 1.56 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1310     Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1311     assertFalse(lock.hasQueuedThread(t1));
1312     assertFalse(lock.hasQueuedThread(t2));
1313     lock.writeLock().lock();
1314 jsr166 1.32 t1.start();
1315 jsr166 1.56 waitForQueuedThread(lock, t1);
1316     assertTrue(lock.hasQueuedThread(t1));
1317     assertFalse(lock.hasQueuedThread(t2));
1318 jsr166 1.32 t2.start();
1319 jsr166 1.56 waitForQueuedThread(lock, t2);
1320     assertTrue(lock.hasQueuedThread(t1));
1321     assertTrue(lock.hasQueuedThread(t2));
1322 jsr166 1.32 t1.interrupt();
1323 jsr166 1.56 awaitTermination(t1);
1324     assertFalse(lock.hasQueuedThread(t1));
1325     assertTrue(lock.hasQueuedThread(t2));
1326     lock.writeLock().unlock();
1327     awaitTermination(t2);
1328     assertFalse(lock.hasQueuedThread(t1));
1329     assertFalse(lock.hasQueuedThread(t2));
1330 jsr166 1.28 }
1331 dl 1.19
1332     /**
1333 dl 1.6 * getQueueLength reports number of waiting threads
1334     */
1335 jsr166 1.60 public void testGetQueueLength() { testGetQueueLength(false); }
1336     public void testGetQueueLength_fair() { testGetQueueLength(true); }
1337     public void testGetQueueLength(boolean fair) {
1338     final PublicReentrantReadWriteLock lock =
1339     new PublicReentrantReadWriteLock(fair);
1340 dl 1.6 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1341     Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1342 jsr166 1.32 assertEquals(0, lock.getQueueLength());
1343     lock.writeLock().lock();
1344     t1.start();
1345 jsr166 1.56 waitForQueuedThread(lock, t1);
1346 jsr166 1.32 assertEquals(1, lock.getQueueLength());
1347     t2.start();
1348 jsr166 1.56 waitForQueuedThread(lock, t2);
1349 jsr166 1.32 assertEquals(2, lock.getQueueLength());
1350     t1.interrupt();
1351 jsr166 1.56 awaitTermination(t1);
1352 jsr166 1.32 assertEquals(1, lock.getQueueLength());
1353     lock.writeLock().unlock();
1354 jsr166 1.56 awaitTermination(t2);
1355 jsr166 1.32 assertEquals(0, lock.getQueueLength());
1356 jsr166 1.28 }
1357 dl 1.6
1358     /**
1359     * getQueuedThreads includes waiting threads
1360     */
1361 jsr166 1.60 public void testGetQueuedThreads() { testGetQueuedThreads(false); }
1362     public void testGetQueuedThreads_fair() { testGetQueuedThreads(true); }
1363     public void testGetQueuedThreads(boolean fair) {
1364     final PublicReentrantReadWriteLock lock =
1365     new PublicReentrantReadWriteLock(fair);
1366 dl 1.6 Thread t1 = new Thread(new InterruptedLockRunnable(lock));
1367     Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
1368 jsr166 1.32 assertTrue(lock.getQueuedThreads().isEmpty());
1369     lock.writeLock().lock();
1370     assertTrue(lock.getQueuedThreads().isEmpty());
1371     t1.start();
1372 jsr166 1.56 waitForQueuedThread(lock, t1);
1373     assertEquals(1, lock.getQueuedThreads().size());
1374 jsr166 1.32 assertTrue(lock.getQueuedThreads().contains(t1));
1375     t2.start();
1376 jsr166 1.56 waitForQueuedThread(lock, t2);
1377     assertEquals(2, lock.getQueuedThreads().size());
1378 jsr166 1.32 assertTrue(lock.getQueuedThreads().contains(t1));
1379     assertTrue(lock.getQueuedThreads().contains(t2));
1380     t1.interrupt();
1381 jsr166 1.56 awaitTermination(t1);
1382 jsr166 1.32 assertFalse(lock.getQueuedThreads().contains(t1));
1383     assertTrue(lock.getQueuedThreads().contains(t2));
1384 jsr166 1.56 assertEquals(1, lock.getQueuedThreads().size());
1385 jsr166 1.32 lock.writeLock().unlock();
1386 jsr166 1.56 awaitTermination(t2);
1387 jsr166 1.32 assertTrue(lock.getQueuedThreads().isEmpty());
1388 jsr166 1.28 }
1389 dl 1.6
1390     /**
1391 dl 1.14 * hasWaiters throws NPE if null
1392     */
1393 jsr166 1.60 public void testHasWaitersNPE() { testHasWaitersNPE(false); }
1394     public void testHasWaitersNPE_fair() { testHasWaitersNPE(true); }
1395     public void testHasWaitersNPE(boolean fair) {
1396     final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1397 dl 1.14 try {
1398     lock.hasWaiters(null);
1399     shouldThrow();
1400 jsr166 1.32 } catch (NullPointerException success) {}
1401 dl 1.14 }
1402    
1403     /**
1404     * getWaitQueueLength throws NPE if null
1405     */
1406 jsr166 1.60 public void testGetWaitQueueLengthNPE() { testGetWaitQueueLengthNPE(false); }
1407     public void testGetWaitQueueLengthNPE_fair() { testGetWaitQueueLengthNPE(true); }
1408     public void testGetWaitQueueLengthNPE(boolean fair) {
1409     final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1410 dl 1.14 try {
1411     lock.getWaitQueueLength(null);
1412     shouldThrow();
1413 jsr166 1.32 } catch (NullPointerException success) {}
1414 dl 1.14 }
1415    
1416     /**
1417     * getWaitingThreads throws NPE if null
1418     */
1419 jsr166 1.60 public void testGetWaitingThreadsNPE() { testGetWaitingThreadsNPE(false); }
1420     public void testGetWaitingThreadsNPE_fair() { testGetWaitingThreadsNPE(true); }
1421     public void testGetWaitingThreadsNPE(boolean fair) {
1422     final PublicReentrantReadWriteLock lock = new PublicReentrantReadWriteLock(fair);
1423 dl 1.14 try {
1424     lock.getWaitingThreads(null);
1425     shouldThrow();
1426 jsr166 1.32 } catch (NullPointerException success) {}
1427 dl 1.14 }
1428    
1429     /**
1430 jsr166 1.59 * hasWaiters throws IllegalArgumentException if not owned
1431 dl 1.13 */
1432 jsr166 1.60 public void testHasWaitersIAE() { testHasWaitersIAE(false); }
1433     public void testHasWaitersIAE_fair() { testHasWaitersIAE(true); }
1434     public void testHasWaitersIAE(boolean fair) {
1435     final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1436 jsr166 1.31 final Condition c = lock.writeLock().newCondition();
1437 jsr166 1.60 final ReentrantReadWriteLock lock2 = new ReentrantReadWriteLock(fair);
1438 dl 1.13 try {
1439     lock2.hasWaiters(c);
1440     shouldThrow();
1441 jsr166 1.32 } catch (IllegalArgumentException success) {}
1442 dl 1.13 }
1443    
1444     /**
1445 jsr166 1.59 * hasWaiters throws IllegalMonitorStateException if not locked
1446 dl 1.13 */
1447 jsr166 1.60 public void testHasWaitersIMSE() { testHasWaitersIMSE(false); }
1448     public void testHasWaitersIMSE_fair() { testHasWaitersIMSE(true); }
1449     public void testHasWaitersIMSE(boolean fair) {
1450     final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1451 jsr166 1.31 final Condition c = lock.writeLock().newCondition();
1452 dl 1.13 try {
1453     lock.hasWaiters(c);
1454     shouldThrow();
1455 jsr166 1.32 } catch (IllegalMonitorStateException success) {}
1456 dl 1.13 }
1457    
1458     /**
1459 jsr166 1.59 * getWaitQueueLength throws IllegalArgumentException if not owned
1460 dl 1.13 */
1461 jsr166 1.60 public void testGetWaitQueueLengthIAE() { testGetWaitQueueLengthIAE(false); }
1462     public void testGetWaitQueueLengthIAE_fair() { testGetWaitQueueLengthIAE(true); }
1463     public void testGetWaitQueueLengthIAE(boolean fair) {
1464     final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1465 jsr166 1.31 final Condition c = lock.writeLock().newCondition();
1466 jsr166 1.60 final ReentrantReadWriteLock lock2 = new ReentrantReadWriteLock(fair);
1467 dl 1.13 try {
1468     lock2.getWaitQueueLength(c);
1469     shouldThrow();
1470 jsr166 1.32 } catch (IllegalArgumentException success) {}
1471 dl 1.13 }
1472    
1473     /**
1474 jsr166 1.59 * getWaitQueueLength throws IllegalMonitorStateException if not locked
1475 dl 1.13 */
1476 jsr166 1.60 public void testGetWaitQueueLengthIMSE() { testGetWaitQueueLengthIMSE(false); }
1477     public void testGetWaitQueueLengthIMSE_fair() { testGetWaitQueueLengthIMSE(true); }
1478     public void testGetWaitQueueLengthIMSE(boolean fair) {
1479     final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1480 jsr166 1.31 final Condition c = lock.writeLock().newCondition();
1481 dl 1.13 try {
1482     lock.getWaitQueueLength(c);
1483     shouldThrow();
1484 jsr166 1.32 } catch (IllegalMonitorStateException success) {}
1485 dl 1.13 }
1486    
1487     /**
1488 jsr166 1.59 * getWaitingThreads throws IllegalArgumentException if not owned
1489 dl 1.13 */
1490 jsr166 1.60 public void testGetWaitingThreadsIAE() { testGetWaitingThreadsIAE(false); }
1491     public void testGetWaitingThreadsIAE_fair() { testGetWaitingThreadsIAE(true); }
1492     public void testGetWaitingThreadsIAE(boolean fair) {
1493     final PublicReentrantReadWriteLock lock =
1494     new PublicReentrantReadWriteLock(fair);
1495 jsr166 1.31 final Condition c = lock.writeLock().newCondition();
1496 jsr166 1.60 final PublicReentrantReadWriteLock lock2 =
1497     new PublicReentrantReadWriteLock(fair);
1498 dl 1.13 try {
1499     lock2.getWaitingThreads(c);
1500     shouldThrow();
1501 jsr166 1.32 } catch (IllegalArgumentException success) {}
1502 dl 1.13 }
1503    
1504     /**
1505 jsr166 1.59 * getWaitingThreads throws IllegalMonitorStateException if not locked
1506 dl 1.13 */
1507 jsr166 1.60 public void testGetWaitingThreadsIMSE() { testGetWaitingThreadsIMSE(false); }
1508     public void testGetWaitingThreadsIMSE_fair() { testGetWaitingThreadsIMSE(true); }
1509     public void testGetWaitingThreadsIMSE(boolean fair) {
1510     final PublicReentrantReadWriteLock lock =
1511     new PublicReentrantReadWriteLock(fair);
1512 jsr166 1.31 final Condition c = lock.writeLock().newCondition();
1513 dl 1.13 try {
1514     lock.getWaitingThreads(c);
1515     shouldThrow();
1516 jsr166 1.32 } catch (IllegalMonitorStateException success) {}
1517 dl 1.13 }
1518    
1519     /**
1520 dl 1.6 * hasWaiters returns true when a thread is waiting, else false
1521     */
1522 jsr166 1.60 public void testHasWaiters() { testHasWaiters(false); }
1523     public void testHasWaiters_fair() { testHasWaiters(true); }
1524     public void testHasWaiters(boolean fair) {
1525     final PublicReentrantReadWriteLock lock =
1526     new PublicReentrantReadWriteLock(fair);
1527 jsr166 1.31 final Condition c = lock.writeLock().newCondition();
1528 jsr166 1.56 final CountDownLatch locked = new CountDownLatch(1);
1529 jsr166 1.45 Thread t = newStartedThread(new CheckedRunnable() {
1530 jsr166 1.33 public void realRun() throws InterruptedException {
1531     lock.writeLock().lock();
1532 jsr166 1.59 assertHasNoWaiters(lock, c);
1533 jsr166 1.42 assertFalse(lock.hasWaiters(c));
1534 jsr166 1.56 locked.countDown();
1535 jsr166 1.33 c.await();
1536 jsr166 1.59 assertHasNoWaiters(lock, c);
1537     assertFalse(lock.hasWaiters(c));
1538 jsr166 1.33 lock.writeLock().unlock();
1539     }});
1540 dl 1.6
1541 jsr166 1.60 await(locked);
1542 jsr166 1.32 lock.writeLock().lock();
1543 jsr166 1.59 assertHasWaiters(lock, c, t);
1544 jsr166 1.32 assertTrue(lock.hasWaiters(c));
1545     c.signal();
1546 jsr166 1.56 assertHasNoWaiters(lock, c);
1547 jsr166 1.59 assertFalse(lock.hasWaiters(c));
1548 jsr166 1.32 lock.writeLock().unlock();
1549 jsr166 1.56 awaitTermination(t);
1550     assertHasNoWaiters(lock, c);
1551 dl 1.6 }
1552    
1553     /**
1554     * getWaitQueueLength returns number of waiting threads
1555     */
1556 jsr166 1.60 public void testGetWaitQueueLength() { testGetWaitQueueLength(false); }
1557     public void testGetWaitQueueLength_fair() { testGetWaitQueueLength(true); }
1558     public void testGetWaitQueueLength(boolean fair) {
1559     final PublicReentrantReadWriteLock lock =
1560     new PublicReentrantReadWriteLock(fair);
1561 jsr166 1.31 final Condition c = lock.writeLock().newCondition();
1562 jsr166 1.56 final CountDownLatch locked = new CountDownLatch(1);
1563 jsr166 1.45 Thread t = newStartedThread(new CheckedRunnable() {
1564 jsr166 1.33 public void realRun() throws InterruptedException {
1565     lock.writeLock().lock();
1566 jsr166 1.42 assertEquals(0, lock.getWaitQueueLength(c));
1567 jsr166 1.56 locked.countDown();
1568 jsr166 1.33 c.await();
1569     lock.writeLock().unlock();
1570     }});
1571 dl 1.13
1572 jsr166 1.60 await(locked);
1573 jsr166 1.32 lock.writeLock().lock();
1574 jsr166 1.56 assertHasWaiters(lock, c, t);
1575 jsr166 1.32 assertEquals(1, lock.getWaitQueueLength(c));
1576     c.signal();
1577 jsr166 1.56 assertHasNoWaiters(lock, c);
1578 jsr166 1.32 assertEquals(0, lock.getWaitQueueLength(c));
1579     lock.writeLock().unlock();
1580 jsr166 1.56 awaitTermination(t);
1581 dl 1.13 }
1582    
1583     /**
1584     * getWaitingThreads returns only and all waiting threads
1585     */
1586 jsr166 1.60 public void testGetWaitingThreads() { testGetWaitingThreads(false); }
1587     public void testGetWaitingThreads_fair() { testGetWaitingThreads(true); }
1588     public void testGetWaitingThreads(boolean fair) {
1589     final PublicReentrantReadWriteLock lock =
1590     new PublicReentrantReadWriteLock(fair);
1591 dl 1.13 final Condition c = lock.writeLock().newCondition();
1592 jsr166 1.56 final CountDownLatch locked1 = new CountDownLatch(1);
1593     final CountDownLatch locked2 = new CountDownLatch(1);
1594 jsr166 1.35 Thread t1 = new Thread(new CheckedRunnable() {
1595 jsr166 1.33 public void realRun() throws InterruptedException {
1596     lock.writeLock().lock();
1597 jsr166 1.42 assertTrue(lock.getWaitingThreads(c).isEmpty());
1598 jsr166 1.56 locked1.countDown();
1599 jsr166 1.33 c.await();
1600     lock.writeLock().unlock();
1601     }});
1602    
1603 jsr166 1.35 Thread t2 = new Thread(new CheckedRunnable() {
1604 jsr166 1.33 public void realRun() throws InterruptedException {
1605     lock.writeLock().lock();
1606 jsr166 1.42 assertFalse(lock.getWaitingThreads(c).isEmpty());
1607 jsr166 1.56 locked2.countDown();
1608 jsr166 1.33 c.await();
1609     lock.writeLock().unlock();
1610     }});
1611 dl 1.6
1612 jsr166 1.32 lock.writeLock().lock();
1613     assertTrue(lock.getWaitingThreads(c).isEmpty());
1614     lock.writeLock().unlock();
1615 jsr166 1.56
1616 jsr166 1.32 t1.start();
1617 jsr166 1.60 await(locked1);
1618 jsr166 1.32 t2.start();
1619 jsr166 1.60 await(locked2);
1620 jsr166 1.56
1621 jsr166 1.32 lock.writeLock().lock();
1622     assertTrue(lock.hasWaiters(c));
1623     assertTrue(lock.getWaitingThreads(c).contains(t1));
1624     assertTrue(lock.getWaitingThreads(c).contains(t2));
1625 jsr166 1.56 assertEquals(2, lock.getWaitingThreads(c).size());
1626 jsr166 1.32 c.signalAll();
1627 jsr166 1.56 assertHasNoWaiters(lock, c);
1628 jsr166 1.32 lock.writeLock().unlock();
1629 jsr166 1.56
1630     awaitTermination(t1);
1631     awaitTermination(t2);
1632    
1633     assertHasNoWaiters(lock, c);
1634 dl 1.6 }
1635 dl 1.13
1636 dl 1.18 /**
1637     * toString indicates current lock state
1638     */
1639 jsr166 1.60 public void testToString() { testToString(false); }
1640     public void testToString_fair() { testToString(true); }
1641     public void testToString(boolean fair) {
1642     ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1643 jsr166 1.64 assertTrue(lock.toString().contains("Write locks = 0"));
1644     assertTrue(lock.toString().contains("Read locks = 0"));
1645     lock.writeLock().lock();
1646     assertTrue(lock.toString().contains("Write locks = 1"));
1647     assertTrue(lock.toString().contains("Read locks = 0"));
1648 dl 1.18 lock.writeLock().unlock();
1649     lock.readLock().lock();
1650     lock.readLock().lock();
1651 jsr166 1.64 assertTrue(lock.toString().contains("Write locks = 0"));
1652     assertTrue(lock.toString().contains("Read locks = 2"));
1653 dl 1.18 }
1654    
1655     /**
1656     * readLock.toString indicates current lock state
1657     */
1658 jsr166 1.60 public void testReadLockToString() { testReadLockToString(false); }
1659     public void testReadLockToString_fair() { testReadLockToString(true); }
1660     public void testReadLockToString(boolean fair) {
1661     ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1662 jsr166 1.64 assertTrue(lock.readLock().toString().contains("Read locks = 0"));
1663 dl 1.18 lock.readLock().lock();
1664     lock.readLock().lock();
1665 jsr166 1.64 assertTrue(lock.readLock().toString().contains("Read locks = 2"));
1666 dl 1.18 }
1667    
1668     /**
1669     * writeLock.toString indicates current lock state
1670     */
1671 jsr166 1.60 public void testWriteLockToString() { testWriteLockToString(false); }
1672     public void testWriteLockToString_fair() { testWriteLockToString(true); }
1673     public void testWriteLockToString(boolean fair) {
1674     ReentrantReadWriteLock lock = new ReentrantReadWriteLock(fair);
1675 jsr166 1.64 assertTrue(lock.writeLock().toString().contains("Unlocked"));
1676 dl 1.18 lock.writeLock().lock();
1677 jsr166 1.64 assertTrue(lock.writeLock().toString().contains("Locked"));
1678     lock.writeLock().unlock();
1679     assertTrue(lock.writeLock().toString().contains("Unlocked"));
1680 dl 1.18 }
1681    
1682 dl 1.1 }