ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ReentrantReadWriteLockTest.java
Revision: 1.66
Committed: Fri Jun 3 05:07:14 2011 UTC (12 years, 11 months ago) by jsr166
Branch: MAIN
Changes since 1.65: +27 -10 lines
Log Message:
improve "uninterruptible" tests

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