ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/StampedLockTest.java
Revision: 1.1
Committed: Fri Feb 1 19:07:36 2013 UTC (11 years, 3 months ago) by jsr166
Branch: MAIN
Log Message:
add support for conditional jdk8 tests

File Contents

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