ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/AbstractQueuedSynchronizerTest.java
(Generate patch)

Comparing jsr166/src/test/tck/AbstractQueuedSynchronizerTest.java (file contents):
Revision 1.16 by dl, Sun Jan 11 16:02:33 2004 UTC vs.
Revision 1.29 by jsr166, Sat Nov 21 02:07:26 2009 UTC

# Line 2 | Line 2
2   * 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   * http://creativecommons.org/licenses/publicdomain
5 < * Other contributors include Andrew Wright, Jeffrey Hayes,
6 < * Pat Fisher, Mike Judd.
5 > * Other contributors include Andrew Wright, Jeffrey Hayes,
6 > * Pat Fisher, Mike Judd.
7   */
8  
9  
# Line 31 | Line 31 | public class AbstractQueuedSynchronizerT
31       */
32      static class Mutex extends AbstractQueuedSynchronizer {
33          public boolean isHeldExclusively() { return getState() == 1; }
34 <        
34 >
35          public boolean tryAcquire(int acquires) {
36 <            assertTrue(acquires == 1);
36 >            assertTrue(acquires == 1);
37              return compareAndSetState(0, 1);
38          }
39 <        
39 >
40          public boolean tryRelease(int releases) {
41              if (getState() == 0) throw new IllegalMonitorStateException();
42              setState(0);
43              return true;
44          }
45 <        
45 >
46          public AbstractQueuedSynchronizer.ConditionObject newCondition() { return new AbstractQueuedSynchronizer.ConditionObject(); }
47        
48        public void lock() {
49            acquire(1);
50        }
47  
48      }
49  
50 <    
50 >
51      /**
52       * A simple latch class, to test shared mode.
53       */
54 <    static class BooleanLatch extends AbstractQueuedSynchronizer {
54 >    static class BooleanLatch extends AbstractQueuedSynchronizer {
55          public boolean isSignalled() { return getState() != 0; }
56  
57          public int tryAcquireShared(int ignore) {
58              return isSignalled()? 1 : -1;
59          }
60 <        
60 >
61          public boolean tryReleaseShared(int ignore) {
62              setState(1);
63              return true;
# Line 69 | Line 65 | public class AbstractQueuedSynchronizerT
65      }
66  
67      /**
68 <     * A runnable calling acquireInterruptibly
68 >     * A runnable calling acquireInterruptibly that does not expect to
69 >     * be interrupted.
70       */
71 <    class InterruptibleLockRunnable implements Runnable {
72 <        final Mutex lock;
73 <        InterruptibleLockRunnable(Mutex l) { lock = l; }
74 <        public void run() {
75 <            try {
79 <                lock.acquireInterruptibly(1);
80 <            } catch(InterruptedException success){}
71 >    class InterruptibleSyncRunnable extends CheckedRunnable {
72 >        final Mutex sync;
73 >        InterruptibleSyncRunnable(Mutex l) { sync = l; }
74 >        public void realRun() throws InterruptedException {
75 >            sync.acquireInterruptibly(1);
76          }
77      }
78  
79  
80      /**
81       * A runnable calling acquireInterruptibly that expects to be
82 <     * interrupted
82 >     * interrupted.
83       */
84 <    class InterruptedLockRunnable implements Runnable {
85 <        final Mutex lock;
86 <        InterruptedLockRunnable(Mutex l) { lock = l; }
87 <        public void run() {
88 <            try {
94 <                lock.acquireInterruptibly(1);
95 <                threadShouldThrow();
96 <            } catch(InterruptedException success){}
84 >    class InterruptedSyncRunnable extends CheckedInterruptedRunnable {
85 >        final Mutex sync;
86 >        InterruptedSyncRunnable(Mutex l) { sync = l; }
87 >        public void realRun() throws InterruptedException {
88 >            sync.acquireInterruptibly(1);
89          }
90      }
91  
92      /**
93       * isHeldExclusively is false upon construction
94       */
95 <    public void testIsHeldExclusively() {
96 <        Mutex rl = new Mutex();
95 >    public void testIsHeldExclusively() {
96 >        Mutex rl = new Mutex();
97          assertFalse(rl.isHeldExclusively());
98      }
99 <    
99 >
100      /**
101 <     * acquiring released lock succeeds
101 >     * acquiring released sync succeeds
102       */
103 <    public void testAcquire() {
104 <        Mutex rl = new Mutex();
103 >    public void testAcquire() {
104 >        Mutex rl = new Mutex();
105          rl.acquire(1);
106          assertTrue(rl.isHeldExclusively());
107          rl.release(1);
108 +        assertFalse(rl.isHeldExclusively());
109      }
110  
111      /**
112 <     * tryAcquire on an released lock succeeds
112 >     * tryAcquire on an released sync succeeds
113       */
114 <    public void testTryAcquire() {
115 <        Mutex rl = new Mutex();
114 >    public void testTryAcquire() {
115 >        Mutex rl = new Mutex();
116          assertTrue(rl.tryAcquire(1));
117          assertTrue(rl.isHeldExclusively());
118          rl.release(1);
# Line 128 | Line 121 | public class AbstractQueuedSynchronizerT
121      /**
122       * hasQueuedThreads reports whether there are waiting threads
123       */
124 <    public void testhasQueuedThreads() {
125 <        final Mutex lock = new Mutex();
126 <        Thread t1 = new Thread(new InterruptedLockRunnable(lock));
127 <        Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
128 <        try {
129 <            assertFalse(lock.hasQueuedThreads());
130 <            lock.acquire(1);
131 <            t1.start();
132 <            Thread.sleep(SHORT_DELAY_MS);
133 <            assertTrue(lock.hasQueuedThreads());
134 <            t2.start();
135 <            Thread.sleep(SHORT_DELAY_MS);
136 <            assertTrue(lock.hasQueuedThreads());
137 <            t1.interrupt();
138 <            Thread.sleep(SHORT_DELAY_MS);
139 <            assertTrue(lock.hasQueuedThreads());
140 <            lock.release(1);
141 <            Thread.sleep(SHORT_DELAY_MS);
142 <            assertFalse(lock.hasQueuedThreads());
143 <            t1.join();
144 <            t2.join();
152 <        } catch(Exception e){
153 <            unexpectedException();
154 <        }
155 <    }
124 >    public void testhasQueuedThreads() throws InterruptedException {
125 >        final Mutex sync = new Mutex();
126 >        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
127 >        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
128 >        assertFalse(sync.hasQueuedThreads());
129 >        sync.acquire(1);
130 >        t1.start();
131 >        Thread.sleep(SHORT_DELAY_MS);
132 >        assertTrue(sync.hasQueuedThreads());
133 >        t2.start();
134 >        Thread.sleep(SHORT_DELAY_MS);
135 >        assertTrue(sync.hasQueuedThreads());
136 >        t1.interrupt();
137 >        Thread.sleep(SHORT_DELAY_MS);
138 >        assertTrue(sync.hasQueuedThreads());
139 >        sync.release(1);
140 >        Thread.sleep(SHORT_DELAY_MS);
141 >        assertFalse(sync.hasQueuedThreads());
142 >        t1.join();
143 >        t2.join();
144 >    }
145  
146      /**
147       * isQueued(null) throws NPE
148       */
149 <    public void testIsQueuedNPE() {
150 <        final Mutex lock = new Mutex();
149 >    public void testIsQueuedNPE() {
150 >        final Mutex sync = new Mutex();
151          try {
152 <            lock.isQueued(null);
152 >            sync.isQueued(null);
153              shouldThrow();
154 <        } catch (NullPointerException success) {
166 <        }
154 >        } catch (NullPointerException success) {}
155      }
156  
157      /**
158       * isQueued reports whether a thread is queued.
159       */
160 <    public void testIsQueued() {
161 <        final Mutex lock = new Mutex();
162 <        Thread t1 = new Thread(new InterruptedLockRunnable(lock));
163 <        Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
164 <        try {
165 <            assertFalse(lock.isQueued(t1));
166 <            assertFalse(lock.isQueued(t2));
167 <            lock.acquire(1);
168 <            t1.start();
169 <            Thread.sleep(SHORT_DELAY_MS);
170 <            assertTrue(lock.isQueued(t1));
171 <            t2.start();
172 <            Thread.sleep(SHORT_DELAY_MS);
173 <            assertTrue(lock.isQueued(t1));
174 <            assertTrue(lock.isQueued(t2));
175 <            t1.interrupt();
176 <            Thread.sleep(SHORT_DELAY_MS);
177 <            assertFalse(lock.isQueued(t1));
178 <            assertTrue(lock.isQueued(t2));
179 <            lock.release(1);
180 <            Thread.sleep(SHORT_DELAY_MS);
181 <            assertFalse(lock.isQueued(t1));
182 <            assertFalse(lock.isQueued(t2));
183 <            t1.join();
184 <            t2.join();
185 <        } catch(Exception e){
198 <            unexpectedException();
199 <        }
200 <    }
160 >    public void testIsQueued() throws InterruptedException {
161 >        final Mutex sync = new Mutex();
162 >        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
163 >        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
164 >        assertFalse(sync.isQueued(t1));
165 >        assertFalse(sync.isQueued(t2));
166 >        sync.acquire(1);
167 >        t1.start();
168 >        Thread.sleep(SHORT_DELAY_MS);
169 >        assertTrue(sync.isQueued(t1));
170 >        t2.start();
171 >        Thread.sleep(SHORT_DELAY_MS);
172 >        assertTrue(sync.isQueued(t1));
173 >        assertTrue(sync.isQueued(t2));
174 >        t1.interrupt();
175 >        Thread.sleep(SHORT_DELAY_MS);
176 >        assertFalse(sync.isQueued(t1));
177 >        assertTrue(sync.isQueued(t2));
178 >        sync.release(1);
179 >        Thread.sleep(SHORT_DELAY_MS);
180 >        assertFalse(sync.isQueued(t1));
181 >        Thread.sleep(SHORT_DELAY_MS);
182 >        assertFalse(sync.isQueued(t2));
183 >        t1.join();
184 >        t2.join();
185 >    }
186  
187      /**
188 <     * getFirstQueuedThread returns first waiting thread or null is none
189 <     */
190 <    public void testGetFirstQueuedThread() {
191 <        final Mutex lock = new Mutex();
192 <        Thread t1 = new Thread(new InterruptedLockRunnable(lock));
193 <        Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
194 <        try {
195 <            assertNull(lock.getFirstQueuedThread());
196 <            lock.acquire(1);
197 <            t1.start();
198 <            Thread.sleep(SHORT_DELAY_MS);
199 <            assertEquals(t1, lock.getFirstQueuedThread());
200 <            t2.start();
201 <            Thread.sleep(SHORT_DELAY_MS);
202 <            assertEquals(t1, lock.getFirstQueuedThread());
203 <            t1.interrupt();
204 <            Thread.sleep(SHORT_DELAY_MS);
205 <            assertEquals(t2, lock.getFirstQueuedThread());
206 <            lock.release(1);
207 <            Thread.sleep(SHORT_DELAY_MS);
208 <            assertNull(lock.getFirstQueuedThread());
209 <            t1.join();
210 <            t2.join();
211 <        } catch(Exception e){
227 <            unexpectedException();
228 <        }
229 <    }
188 >     * getFirstQueuedThread returns first waiting thread or null if none
189 >     */
190 >    public void testGetFirstQueuedThread() throws InterruptedException {
191 >        final Mutex sync = new Mutex();
192 >        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
193 >        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
194 >        assertNull(sync.getFirstQueuedThread());
195 >        sync.acquire(1);
196 >        t1.start();
197 >        Thread.sleep(SHORT_DELAY_MS);
198 >        assertEquals(t1, sync.getFirstQueuedThread());
199 >        t2.start();
200 >        Thread.sleep(SHORT_DELAY_MS);
201 >        assertEquals(t1, sync.getFirstQueuedThread());
202 >        t1.interrupt();
203 >        Thread.sleep(SHORT_DELAY_MS);
204 >        Thread.sleep(SHORT_DELAY_MS);
205 >        assertEquals(t2, sync.getFirstQueuedThread());
206 >        sync.release(1);
207 >        Thread.sleep(SHORT_DELAY_MS);
208 >        assertNull(sync.getFirstQueuedThread());
209 >        t1.join();
210 >        t2.join();
211 >    }
212  
213  
214      /**
215       * hasContended reports false if no thread has ever blocked, else true
216       */
217 <    public void testHasContended() {
218 <        final Mutex lock = new Mutex();
219 <        Thread t1 = new Thread(new InterruptedLockRunnable(lock));
220 <        Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
221 <        try {
222 <            assertFalse(lock.hasContended());
223 <            lock.acquire(1);
224 <            t1.start();
225 <            Thread.sleep(SHORT_DELAY_MS);
226 <            assertTrue(lock.hasContended());
227 <            t2.start();
228 <            Thread.sleep(SHORT_DELAY_MS);
229 <            assertTrue(lock.hasContended());
230 <            t1.interrupt();
231 <            Thread.sleep(SHORT_DELAY_MS);
232 <            assertTrue(lock.hasContended());
233 <            lock.release(1);
234 <            Thread.sleep(SHORT_DELAY_MS);
235 <            assertTrue(lock.hasContended());
236 <            t1.join();
237 <            t2.join();
238 <        } catch(Exception e){
239 <            unexpectedException();
240 <        }
241 <    }
217 >    public void testHasContended() throws InterruptedException {
218 >        final Mutex sync = new Mutex();
219 >        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
220 >        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
221 >        assertFalse(sync.hasContended());
222 >        sync.acquire(1);
223 >        t1.start();
224 >        Thread.sleep(SHORT_DELAY_MS);
225 >        assertTrue(sync.hasContended());
226 >        t2.start();
227 >        Thread.sleep(SHORT_DELAY_MS);
228 >        assertTrue(sync.hasContended());
229 >        t1.interrupt();
230 >        Thread.sleep(SHORT_DELAY_MS);
231 >        assertTrue(sync.hasContended());
232 >        sync.release(1);
233 >        Thread.sleep(SHORT_DELAY_MS);
234 >        assertTrue(sync.hasContended());
235 >        t1.join();
236 >        t2.join();
237 >    }
238 >
239 >    /**
240 >     * getQueuedThreads includes waiting threads
241 >     */
242 >    public void testGetQueuedThreads() throws InterruptedException {
243 >        final Mutex sync = new Mutex();
244 >        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
245 >        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
246 >        assertTrue(sync.getQueuedThreads().isEmpty());
247 >        sync.acquire(1);
248 >        assertTrue(sync.getQueuedThreads().isEmpty());
249 >        t1.start();
250 >        Thread.sleep(SHORT_DELAY_MS);
251 >        assertTrue(sync.getQueuedThreads().contains(t1));
252 >        t2.start();
253 >        Thread.sleep(SHORT_DELAY_MS);
254 >        assertTrue(sync.getQueuedThreads().contains(t1));
255 >        assertTrue(sync.getQueuedThreads().contains(t2));
256 >        t1.interrupt();
257 >        Thread.sleep(SHORT_DELAY_MS);
258 >        assertFalse(sync.getQueuedThreads().contains(t1));
259 >        assertTrue(sync.getQueuedThreads().contains(t2));
260 >        sync.release(1);
261 >        Thread.sleep(SHORT_DELAY_MS);
262 >        assertTrue(sync.getQueuedThreads().isEmpty());
263 >        t1.join();
264 >        t2.join();
265 >    }
266 >
267 >    /**
268 >     * getExclusiveQueuedThreads includes waiting threads
269 >     */
270 >    public void testGetExclusiveQueuedThreads() throws InterruptedException {
271 >        final Mutex sync = new Mutex();
272 >        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
273 >        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
274 >        assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
275 >        sync.acquire(1);
276 >        assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
277 >        t1.start();
278 >        Thread.sleep(SHORT_DELAY_MS);
279 >        assertTrue(sync.getExclusiveQueuedThreads().contains(t1));
280 >        t2.start();
281 >        Thread.sleep(SHORT_DELAY_MS);
282 >        assertTrue(sync.getExclusiveQueuedThreads().contains(t1));
283 >        assertTrue(sync.getExclusiveQueuedThreads().contains(t2));
284 >        t1.interrupt();
285 >        Thread.sleep(SHORT_DELAY_MS);
286 >        assertFalse(sync.getExclusiveQueuedThreads().contains(t1));
287 >        assertTrue(sync.getExclusiveQueuedThreads().contains(t2));
288 >        sync.release(1);
289 >        Thread.sleep(SHORT_DELAY_MS);
290 >        assertTrue(sync.getExclusiveQueuedThreads().isEmpty());
291 >        t1.join();
292 >        t2.join();
293 >    }
294 >
295 >    /**
296 >     * getSharedQueuedThreads does not include exclusively waiting threads
297 >     */
298 >    public void testGetSharedQueuedThreads() throws InterruptedException {
299 >        final Mutex sync = new Mutex();
300 >        Thread t1 = new Thread(new InterruptedSyncRunnable(sync));
301 >        Thread t2 = new Thread(new InterruptibleSyncRunnable(sync));
302 >        assertTrue(sync.getSharedQueuedThreads().isEmpty());
303 >        sync.acquire(1);
304 >        assertTrue(sync.getSharedQueuedThreads().isEmpty());
305 >        t1.start();
306 >        Thread.sleep(SHORT_DELAY_MS);
307 >        assertTrue(sync.getSharedQueuedThreads().isEmpty());
308 >        t2.start();
309 >        Thread.sleep(SHORT_DELAY_MS);
310 >        assertTrue(sync.getSharedQueuedThreads().isEmpty());
311 >        t1.interrupt();
312 >        Thread.sleep(SHORT_DELAY_MS);
313 >        assertTrue(sync.getSharedQueuedThreads().isEmpty());
314 >        sync.release(1);
315 >        Thread.sleep(SHORT_DELAY_MS);
316 >        assertTrue(sync.getSharedQueuedThreads().isEmpty());
317 >        t1.join();
318 >        t2.join();
319 >    }
320  
321      /**
322       * tryAcquireNanos is interruptible.
323       */
324 <    public void testInterruptedException2() {
325 <        final Mutex lock = new Mutex();
326 <        lock.acquire(1);
327 <        Thread t = new Thread(new Runnable() {
328 <                public void run() {
329 <                    try {
330 <                        lock.tryAcquireNanos(1, MEDIUM_DELAY_MS * 1000 * 1000);
331 <                        threadShouldThrow();
332 <                    } catch(InterruptedException success){}
333 <                }
334 <            });
275 <        try {
276 <            t.start();
277 <            t.interrupt();
278 <        } catch(Exception e){
279 <            unexpectedException();
280 <        }
324 >    public void testInterruptedException2() throws InterruptedException {
325 >        final Mutex sync = new Mutex();
326 >        sync.acquire(1);
327 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
328 >            public void realRun() throws InterruptedException {
329 >                sync.tryAcquireNanos(1, MEDIUM_DELAY_MS * 1000 * 1000);
330 >            }});
331 >
332 >        t.start();
333 >        t.interrupt();
334 >        t.join();
335      }
336  
337  
338      /**
339 <     * TryAcquire on a locked lock fails
339 >     * TryAcquire on exclusively held sync fails
340       */
341 <    public void testTryAcquireWhenLocked() {
342 <        final Mutex lock = new Mutex();
343 <        lock.acquire(1);
344 <        Thread t = new Thread(new Runnable() {
345 <                public void run() {
346 <                    threadAssertFalse(lock.tryAcquire(1));
347 <                }
348 <            });
349 <        try {
350 <            t.start();
351 <            t.join();
352 <            lock.release(1);
299 <        } catch(Exception e){
300 <            unexpectedException();
301 <        }
302 <    }
341 >    public void testTryAcquireWhenSynced() throws InterruptedException {
342 >        final Mutex sync = new Mutex();
343 >        sync.acquire(1);
344 >        Thread t = new Thread(new CheckedRunnable() {
345 >            public void realRun() {
346 >                threadAssertFalse(sync.tryAcquire(1));
347 >            }});
348 >
349 >        t.start();
350 >        t.join();
351 >        sync.release(1);
352 >    }
353  
354      /**
355 <     * tryAcquireNanos on a locked lock times out
355 >     * tryAcquireNanos on an exclusively held sync times out
356       */
357 <    public void testAcquireNanos_Timeout() {
358 <        final Mutex lock = new Mutex();
359 <        lock.acquire(1);
360 <        Thread t = new Thread(new Runnable() {
361 <                public void run() {
362 <                    try {
363 <                        threadAssertFalse(lock.tryAcquireNanos(1, 1000 * 1000));
364 <                    } catch (Exception ex) {
365 <                        threadUnexpectedException();
366 <                    }
367 <                }
368 <            });
369 <        try {
370 <            t.start();
321 <            t.join();
322 <            lock.release(1);
323 <        } catch(Exception e){
324 <            unexpectedException();
325 <        }
326 <    }
327 <    
328 <  
357 >    public void testAcquireNanos_Timeout() throws InterruptedException {
358 >        final Mutex sync = new Mutex();
359 >        sync.acquire(1);
360 >        Thread t = new Thread(new CheckedRunnable() {
361 >            public void realRun() throws InterruptedException {
362 >                threadAssertFalse(sync.tryAcquireNanos(1, 1000 * 1000));
363 >            }});
364 >
365 >        t.start();
366 >        t.join();
367 >        sync.release(1);
368 >    }
369 >
370 >
371      /**
372       * getState is true when acquired and false when not
373       */
374 <    public void testGetState() {
375 <        final Mutex lock = new Mutex();
376 <        lock.acquire(1);
377 <        assertTrue(lock.isHeldExclusively());
378 <        lock.release(1);
379 <        assertFalse(lock.isHeldExclusively());
380 <        Thread t = new Thread(new Runnable() {
381 <                public void run() {
382 <                    lock.acquire(1);
383 <                    try {
384 <                        Thread.sleep(SMALL_DELAY_MS);
385 <                    }
386 <                    catch(Exception e) {
387 <                        threadUnexpectedException();
388 <                    }
389 <                    lock.release(1);
390 <                }
391 <            });
350 <        try {
351 <            t.start();
352 <            Thread.sleep(SHORT_DELAY_MS);
353 <            assertTrue(lock.isHeldExclusively());
354 <            t.join();
355 <            assertFalse(lock.isHeldExclusively());
356 <        } catch(Exception e){
357 <            unexpectedException();
358 <        }
374 >    public void testGetState() throws InterruptedException {
375 >        final Mutex sync = new Mutex();
376 >        sync.acquire(1);
377 >        assertTrue(sync.isHeldExclusively());
378 >        sync.release(1);
379 >        assertFalse(sync.isHeldExclusively());
380 >        Thread t = new Thread(new CheckedRunnable() {
381 >            public void realRun() throws InterruptedException {
382 >                sync.acquire(1);
383 >                Thread.sleep(SMALL_DELAY_MS);
384 >                sync.release(1);
385 >            }});
386 >
387 >        t.start();
388 >        Thread.sleep(SHORT_DELAY_MS);
389 >        assertTrue(sync.isHeldExclusively());
390 >        t.join();
391 >        assertFalse(sync.isHeldExclusively());
392      }
393  
394  
395      /**
396       * acquireInterruptibly is interruptible.
397       */
398 <    public void testAcquireInterruptibly1() {
399 <        final Mutex lock = new Mutex();
400 <        lock.acquire(1);
401 <        Thread t = new Thread(new InterruptedLockRunnable(lock));
402 <        try {
403 <            t.start();
404 <            t.interrupt();
405 <            lock.release(1);
406 <            t.join();
407 <        } catch(Exception e){
408 <            unexpectedException();
409 <        }
377 <    }
398 >    public void testAcquireInterruptibly1() throws InterruptedException {
399 >        final Mutex sync = new Mutex();
400 >        sync.acquire(1);
401 >        Thread t = new Thread(new InterruptedSyncRunnable(sync));
402 >
403 >        t.start();
404 >        Thread.sleep(SHORT_DELAY_MS);
405 >        t.interrupt();
406 >        Thread.sleep(SHORT_DELAY_MS);
407 >        sync.release(1);
408 >        t.join();
409 >    }
410  
411      /**
412       * acquireInterruptibly succeeds when released, else is interruptible
413       */
414 <    public void testAcquireInterruptibly2() {
415 <        final Mutex lock = new Mutex();
416 <        try {
417 <            lock.acquireInterruptibly(1);
418 <        } catch(Exception e) {
419 <            unexpectedException();
420 <        }
421 <        Thread t = new Thread(new InterruptedLockRunnable(lock));
390 <        try {
391 <            t.start();
392 <            t.interrupt();
393 <            assertTrue(lock.isHeldExclusively());
394 <            t.join();
395 <        } catch(Exception e){
396 <            unexpectedException();
397 <        }
414 >    public void testAcquireInterruptibly2() throws InterruptedException {
415 >        final Mutex sync = new Mutex();
416 >        sync.acquireInterruptibly(1);
417 >        Thread t = new Thread(new InterruptedSyncRunnable(sync));
418 >        t.start();
419 >        t.interrupt();
420 >        assertTrue(sync.isHeldExclusively());
421 >        t.join();
422      }
423  
424      /**
425 <     * owns is true for a condition created by lock else false
425 >     * owns is true for a condition created by sync else false
426       */
427      public void testOwns() {
428 <        final Mutex lock = new Mutex();
429 <        final AbstractQueuedSynchronizer.ConditionObject c = lock.newCondition();
430 <        final Mutex lock2 = new Mutex();
431 <        assertTrue(lock.owns(c));
432 <        assertFalse(lock2.owns(c));
428 >        final Mutex sync = new Mutex();
429 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
430 >        final Mutex sync2 = new Mutex();
431 >        assertTrue(sync.owns(c));
432 >        assertFalse(sync2.owns(c));
433      }
434  
435      /**
436 <     * Calling await without holding lock throws IllegalMonitorStateException
436 >     * Calling await without holding sync throws IllegalMonitorStateException
437       */
438 <    public void testAwait_IllegalMonitor() {
439 <        final Mutex lock = new Mutex();
440 <        final AbstractQueuedSynchronizer.ConditionObject c = lock.newCondition();
438 >    public void testAwait_IllegalMonitor() throws InterruptedException {
439 >        final Mutex sync = new Mutex();
440 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
441          try {
442              c.await();
443              shouldThrow();
444 <        }
421 <        catch (IllegalMonitorStateException success) {
422 <        }
423 <        catch (Exception ex) {
424 <            unexpectedException();
425 <        }
444 >        } catch (IllegalMonitorStateException success) {}
445      }
446  
447      /**
448 <     * Calling signal without holding lock throws IllegalMonitorStateException
448 >     * Calling signal without holding sync throws IllegalMonitorStateException
449       */
450      public void testSignal_IllegalMonitor() {
451 <        final Mutex lock = new Mutex();
452 <        final AbstractQueuedSynchronizer.ConditionObject c = lock.newCondition();
451 >        final Mutex sync = new Mutex();
452 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
453          try {
454              c.signal();
455              shouldThrow();
456 <        }
438 <        catch (IllegalMonitorStateException success) {
439 <        }
440 <        catch (Exception ex) {
441 <            unexpectedException();
442 <        }
456 >        } catch (IllegalMonitorStateException success) {}
457      }
458  
459      /**
460       * awaitNanos without a signal times out
461       */
462 <    public void testAwaitNanos_Timeout() {
463 <        final Mutex lock = new Mutex();
464 <        final AbstractQueuedSynchronizer.ConditionObject c = lock.newCondition();
465 <        try {
466 <            lock.acquire(1);
467 <            long t = c.awaitNanos(100);
468 <            assertTrue(t <= 0);
455 <            lock.release(1);
456 <        }
457 <        catch (Exception ex) {
458 <            unexpectedException();
459 <        }
462 >    public void testAwaitNanos_Timeout() throws InterruptedException {
463 >        final Mutex sync = new Mutex();
464 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
465 >        sync.acquire(1);
466 >        long t = c.awaitNanos(100);
467 >        assertTrue(t <= 0);
468 >        sync.release(1);
469      }
470  
471      /**
472 <     *  timed await without a signal times out
473 <     */
474 <    public void testAwait_Timeout() {
475 <        final Mutex lock = new Mutex();
476 <        final AbstractQueuedSynchronizer.ConditionObject c = lock.newCondition();
477 <        try {
478 <            lock.acquire(1);
479 <            assertFalse(c.await(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
471 <            lock.release(1);
472 <        }
473 <        catch (Exception ex) {
474 <            unexpectedException();
475 <        }
472 >     *  Timed await without a signal times out
473 >     */
474 >    public void testAwait_Timeout() throws InterruptedException {
475 >        final Mutex sync = new Mutex();
476 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
477 >        sync.acquire(1);
478 >        assertFalse(c.await(SHORT_DELAY_MS, TimeUnit.MILLISECONDS));
479 >        sync.release(1);
480      }
481  
482      /**
483       * awaitUntil without a signal times out
484       */
485 <    public void testAwaitUntil_Timeout() {
486 <        final Mutex lock = new Mutex();
487 <        final AbstractQueuedSynchronizer.ConditionObject c = lock.newCondition();
488 <        try {
489 <            lock.acquire(1);
490 <            java.util.Date d = new java.util.Date();
491 <            assertFalse(c.awaitUntil(new java.util.Date(d.getTime() + 10)));
488 <            lock.release(1);
489 <        }
490 <        catch (Exception ex) {
491 <            unexpectedException();
492 <        }
485 >    public void testAwaitUntil_Timeout() throws InterruptedException {
486 >        final Mutex sync = new Mutex();
487 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
488 >        sync.acquire(1);
489 >        java.util.Date d = new java.util.Date();
490 >        assertFalse(c.awaitUntil(new java.util.Date(d.getTime() + 10)));
491 >        sync.release(1);
492      }
493  
494      /**
495       * await returns when signalled
496       */
497 <    public void testAwait() {
498 <        final Mutex lock = new Mutex();
499 <        final AbstractQueuedSynchronizer.ConditionObject c = lock.newCondition();
500 <        Thread t = new Thread(new Runnable() {
501 <                public void run() {
502 <                    try {
503 <                        lock.acquire(1);
504 <                        c.await();
505 <                        lock.release(1);
507 <                    }
508 <                    catch(InterruptedException e) {
509 <                        threadUnexpectedException();
510 <                    }
511 <                }
512 <            });
497 >    public void testAwait() throws InterruptedException {
498 >        final Mutex sync = new Mutex();
499 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
500 >        Thread t = new Thread(new CheckedRunnable() {
501 >            public void realRun() throws InterruptedException {
502 >                sync.acquire(1);
503 >                c.await();
504 >                sync.release(1);
505 >            }});
506  
507 <        try {
508 <            t.start();
509 <            Thread.sleep(SHORT_DELAY_MS);
510 <            lock.acquire(1);
511 <            c.signal();
512 <            lock.release(1);
513 <            t.join(SHORT_DELAY_MS);
521 <            assertFalse(t.isAlive());
522 <        }
523 <        catch (Exception ex) {
524 <            unexpectedException();
525 <        }
507 >        t.start();
508 >        Thread.sleep(SHORT_DELAY_MS);
509 >        sync.acquire(1);
510 >        c.signal();
511 >        sync.release(1);
512 >        t.join(SHORT_DELAY_MS);
513 >        assertFalse(t.isAlive());
514      }
515  
516  
# Line 531 | Line 519 | public class AbstractQueuedSynchronizerT
519       * hasWaiters throws NPE if null
520       */
521      public void testHasWaitersNPE() {
522 <        final Mutex lock = new Mutex();
522 >        final Mutex sync = new Mutex();
523          try {
524 <            lock.hasWaiters(null);
524 >            sync.hasWaiters(null);
525              shouldThrow();
526 <        } catch (NullPointerException success) {
539 <        } catch (Exception ex) {
540 <            unexpectedException();
541 <        }
526 >        } catch (NullPointerException success) {}
527      }
528  
529      /**
530       * getWaitQueueLength throws NPE if null
531       */
532      public void testGetWaitQueueLengthNPE() {
533 <        final Mutex lock = new Mutex();
533 >        final Mutex sync = new Mutex();
534          try {
535 <            lock.getWaitQueueLength(null);
535 >            sync.getWaitQueueLength(null);
536              shouldThrow();
537 <        } catch (NullPointerException success) {
553 <        } catch (Exception ex) {
554 <            unexpectedException();
555 <        }
537 >        } catch (NullPointerException success) {}
538      }
539  
540  
# Line 560 | Line 542 | public class AbstractQueuedSynchronizerT
542       * getWaitingThreads throws NPE if null
543       */
544      public void testGetWaitingThreadsNPE() {
545 <        final Mutex lock = new Mutex();
545 >        final Mutex sync = new Mutex();
546          try {
547 <            lock.getWaitingThreads(null);
547 >            sync.getWaitingThreads(null);
548              shouldThrow();
549 <        } catch (NullPointerException success) {
568 <        } catch (Exception ex) {
569 <            unexpectedException();
570 <        }
549 >        } catch (NullPointerException success) {}
550      }
551  
552  
# Line 575 | Line 554 | public class AbstractQueuedSynchronizerT
554       * hasWaiters throws IAE if not owned
555       */
556      public void testHasWaitersIAE() {
557 <        final Mutex lock = new Mutex();
558 <        final AbstractQueuedSynchronizer.ConditionObject c = (lock.newCondition());
559 <        final Mutex lock2 = new Mutex();
557 >        final Mutex sync = new Mutex();
558 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
559 >        final Mutex sync2 = new Mutex();
560          try {
561 <            lock2.hasWaiters(c);
561 >            sync2.hasWaiters(c);
562              shouldThrow();
563 <        } catch (IllegalArgumentException success) {
585 <        } catch (Exception ex) {
586 <            unexpectedException();
587 <        }
563 >        } catch (IllegalArgumentException success) {}
564      }
565  
566      /**
567 <     * hasWaiters throws IMSE if not locked
567 >     * hasWaiters throws IMSE if not synced
568       */
569      public void testHasWaitersIMSE() {
570 <        final Mutex lock = new Mutex();
571 <        final AbstractQueuedSynchronizer.ConditionObject c = (lock.newCondition());
570 >        final Mutex sync = new Mutex();
571 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
572          try {
573 <            lock.hasWaiters(c);
573 >            sync.hasWaiters(c);
574              shouldThrow();
575 <        } catch (IllegalMonitorStateException success) {
600 <        } catch (Exception ex) {
601 <            unexpectedException();
602 <        }
575 >        } catch (IllegalMonitorStateException success) {}
576      }
577  
578  
# Line 607 | Line 580 | public class AbstractQueuedSynchronizerT
580       * getWaitQueueLength throws IAE if not owned
581       */
582      public void testGetWaitQueueLengthIAE() {
583 <        final Mutex lock = new Mutex();
584 <        final AbstractQueuedSynchronizer.ConditionObject c = (lock.newCondition());
585 <        final Mutex lock2 = new Mutex();
583 >        final Mutex sync = new Mutex();
584 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
585 >        final Mutex sync2 = new Mutex();
586          try {
587 <            lock2.getWaitQueueLength(c);
587 >            sync2.getWaitQueueLength(c);
588              shouldThrow();
589 <        } catch (IllegalArgumentException success) {
617 <        } catch (Exception ex) {
618 <            unexpectedException();
619 <        }
589 >        } catch (IllegalArgumentException success) {}
590      }
591  
592      /**
593 <     * getWaitQueueLength throws IMSE if not locked
593 >     * getWaitQueueLength throws IMSE if not synced
594       */
595      public void testGetWaitQueueLengthIMSE() {
596 <        final Mutex lock = new Mutex();
597 <        final AbstractQueuedSynchronizer.ConditionObject c = (lock.newCondition());
596 >        final Mutex sync = new Mutex();
597 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
598          try {
599 <            lock.getWaitQueueLength(c);
599 >            sync.getWaitQueueLength(c);
600              shouldThrow();
601 <        } catch (IllegalMonitorStateException success) {
632 <        } catch (Exception ex) {
633 <            unexpectedException();
634 <        }
601 >        } catch (IllegalMonitorStateException success) {}
602      }
603  
604  
# Line 639 | Line 606 | public class AbstractQueuedSynchronizerT
606       * getWaitingThreads throws IAE if not owned
607       */
608      public void testGetWaitingThreadsIAE() {
609 <        final Mutex lock = new Mutex();
610 <        final AbstractQueuedSynchronizer.ConditionObject c = (lock.newCondition());
611 <        final Mutex lock2 = new Mutex();        
609 >        final Mutex sync = new Mutex();
610 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
611 >        final Mutex sync2 = new Mutex();
612          try {
613 <            lock2.getWaitingThreads(c);
613 >            sync2.getWaitingThreads(c);
614              shouldThrow();
615 <        } catch (IllegalArgumentException success) {
649 <        } catch (Exception ex) {
650 <            unexpectedException();
651 <        }
615 >        } catch (IllegalArgumentException success) {}
616      }
617  
618      /**
619 <     * getWaitingThreads throws IMSE if not locked
619 >     * getWaitingThreads throws IMSE if not synced
620       */
621      public void testGetWaitingThreadsIMSE() {
622 <        final Mutex lock = new Mutex();
623 <        final AbstractQueuedSynchronizer.ConditionObject c = (lock.newCondition());
622 >        final Mutex sync = new Mutex();
623 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
624          try {
625 <            lock.getWaitingThreads(c);
625 >            sync.getWaitingThreads(c);
626              shouldThrow();
627 <        } catch (IllegalMonitorStateException success) {
664 <        } catch (Exception ex) {
665 <            unexpectedException();
666 <        }
627 >        } catch (IllegalMonitorStateException success) {}
628      }
629  
630  
# Line 671 | Line 632 | public class AbstractQueuedSynchronizerT
632      /**
633       * hasWaiters returns true when a thread is waiting, else false
634       */
635 <    public void testHasWaiters() {
636 <        final Mutex lock = new Mutex();
637 <        final AbstractQueuedSynchronizer.ConditionObject c = lock.newCondition();
638 <        Thread t = new Thread(new Runnable() {
639 <                public void run() {
640 <                    try {
641 <                        lock.acquire(1);
642 <                        threadAssertFalse(lock.hasWaiters(c));
643 <                        threadAssertEquals(0, lock.getWaitQueueLength(c));
644 <                        c.await();
645 <                        lock.release(1);
685 <                    }
686 <                    catch(InterruptedException e) {
687 <                        threadUnexpectedException();
688 <                    }
689 <                }
690 <            });
635 >    public void testHasWaiters() throws InterruptedException {
636 >        final Mutex sync = new Mutex();
637 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
638 >        Thread t = new Thread(new CheckedRunnable() {
639 >            public void realRun() throws InterruptedException {
640 >                sync.acquire(1);
641 >                threadAssertFalse(sync.hasWaiters(c));
642 >                threadAssertEquals(0, sync.getWaitQueueLength(c));
643 >                c.await();
644 >                sync.release(1);
645 >            }});
646  
647 <        try {
648 <            t.start();
649 <            Thread.sleep(SHORT_DELAY_MS);
650 <            lock.acquire(1);
651 <            assertTrue(lock.hasWaiters(c));
652 <            assertEquals(1, lock.getWaitQueueLength(c));
653 <            c.signal();
654 <            lock.release(1);
655 <            Thread.sleep(SHORT_DELAY_MS);
656 <            lock.acquire(1);
657 <            assertFalse(lock.hasWaiters(c));
658 <            assertEquals(0, lock.getWaitQueueLength(c));
659 <            lock.release(1);
660 <            t.join(SHORT_DELAY_MS);
706 <            assertFalse(t.isAlive());
707 <        }
708 <        catch (Exception ex) {
709 <            unexpectedException();
710 <        }
647 >        t.start();
648 >        Thread.sleep(SHORT_DELAY_MS);
649 >        sync.acquire(1);
650 >        assertTrue(sync.hasWaiters(c));
651 >        assertEquals(1, sync.getWaitQueueLength(c));
652 >        c.signal();
653 >        sync.release(1);
654 >        Thread.sleep(SHORT_DELAY_MS);
655 >        sync.acquire(1);
656 >        assertFalse(sync.hasWaiters(c));
657 >        assertEquals(0, sync.getWaitQueueLength(c));
658 >        sync.release(1);
659 >        t.join(SHORT_DELAY_MS);
660 >        assertFalse(t.isAlive());
661      }
662  
663      /**
664       * getWaitQueueLength returns number of waiting threads
665       */
666 <    public void testGetWaitQueueLength() {
667 <        final Mutex lock = new Mutex();
668 <        final AbstractQueuedSynchronizer.ConditionObject c = lock.newCondition();
669 <        Thread t1 = new Thread(new Runnable() {
670 <                public void run() {
671 <                    try {
672 <                        lock.acquire(1);
673 <                        threadAssertFalse(lock.hasWaiters(c));
674 <                        threadAssertEquals(0, lock.getWaitQueueLength(c));
675 <                        c.await();
676 <                        lock.release(1);
677 <                    }
678 <                    catch(InterruptedException e) {
679 <                        threadUnexpectedException();
680 <                    }
681 <                }
682 <            });
683 <
684 <        Thread t2 = new Thread(new Runnable() {
685 <                public void run() {
686 <                    try {
687 <                        lock.acquire(1);
688 <                        threadAssertTrue(lock.hasWaiters(c));
689 <                        threadAssertEquals(1, lock.getWaitQueueLength(c));
690 <                        c.await();
691 <                        lock.release(1);
692 <                    }
693 <                    catch(InterruptedException e) {
694 <                        threadUnexpectedException();
695 <                    }
696 <                }
697 <            });
698 <
699 <        try {
700 <            t1.start();
701 <            Thread.sleep(SHORT_DELAY_MS);
702 <            t2.start();
703 <            Thread.sleep(SHORT_DELAY_MS);
704 <            lock.acquire(1);
755 <            assertTrue(lock.hasWaiters(c));
756 <            assertEquals(2, lock.getWaitQueueLength(c));
757 <            c.signalAll();
758 <            lock.release(1);
759 <            Thread.sleep(SHORT_DELAY_MS);
760 <            lock.acquire(1);
761 <            assertFalse(lock.hasWaiters(c));
762 <            assertEquals(0, lock.getWaitQueueLength(c));
763 <            lock.release(1);
764 <            t1.join(SHORT_DELAY_MS);
765 <            t2.join(SHORT_DELAY_MS);
766 <            assertFalse(t1.isAlive());
767 <            assertFalse(t2.isAlive());
768 <        }
769 <        catch (Exception ex) {
770 <            unexpectedException();
771 <        }
666 >    public void testGetWaitQueueLength() throws InterruptedException {
667 >        final Mutex sync = new Mutex();
668 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
669 >        Thread t1 = new Thread(new CheckedRunnable() {
670 >            public void realRun() throws InterruptedException {
671 >                sync.acquire(1);
672 >                threadAssertFalse(sync.hasWaiters(c));
673 >                threadAssertEquals(0, sync.getWaitQueueLength(c));
674 >                c.await();
675 >                sync.release(1);
676 >            }});
677 >
678 >        Thread t2 = new Thread(new CheckedRunnable() {
679 >            public void realRun() throws InterruptedException {
680 >                sync.acquire(1);
681 >                threadAssertTrue(sync.hasWaiters(c));
682 >                threadAssertEquals(1, sync.getWaitQueueLength(c));
683 >                c.await();
684 >                sync.release(1);
685 >            }});
686 >
687 >        t1.start();
688 >        Thread.sleep(SHORT_DELAY_MS);
689 >        t2.start();
690 >        Thread.sleep(SHORT_DELAY_MS);
691 >        sync.acquire(1);
692 >        assertTrue(sync.hasWaiters(c));
693 >        assertEquals(2, sync.getWaitQueueLength(c));
694 >        c.signalAll();
695 >        sync.release(1);
696 >        Thread.sleep(SHORT_DELAY_MS);
697 >        sync.acquire(1);
698 >        assertFalse(sync.hasWaiters(c));
699 >        assertEquals(0, sync.getWaitQueueLength(c));
700 >        sync.release(1);
701 >        t1.join(SHORT_DELAY_MS);
702 >        t2.join(SHORT_DELAY_MS);
703 >        assertFalse(t1.isAlive());
704 >        assertFalse(t2.isAlive());
705      }
706  
707      /**
708       * getWaitingThreads returns only and all waiting threads
709       */
710 <    public void testGetWaitingThreads() {
711 <        final Mutex lock = new Mutex();
712 <        final AbstractQueuedSynchronizer.ConditionObject c = lock.newCondition();
713 <        Thread t1 = new Thread(new Runnable() {
714 <                public void run() {
715 <                    try {
716 <                        lock.acquire(1);
717 <                        threadAssertTrue(lock.getWaitingThreads(c).isEmpty());
718 <                        c.await();
719 <                        lock.release(1);
720 <                    }
721 <                    catch(InterruptedException e) {
722 <                        threadUnexpectedException();
723 <                    }
724 <                }
725 <            });
726 <
727 <        Thread t2 = new Thread(new Runnable() {
728 <                public void run() {
729 <                    try {
730 <                        lock.acquire(1);
731 <                        threadAssertFalse(lock.getWaitingThreads(c).isEmpty());
732 <                        c.await();
733 <                        lock.release(1);
734 <                    }
735 <                    catch(InterruptedException e) {
736 <                        threadUnexpectedException();
737 <                    }
738 <                }
739 <            });
740 <
741 <        try {
742 <            lock.acquire(1);
743 <            assertTrue(lock.getWaitingThreads(c).isEmpty());
744 <            lock.release(1);
745 <            t1.start();
746 <            Thread.sleep(SHORT_DELAY_MS);
747 <            t2.start();
748 <            Thread.sleep(SHORT_DELAY_MS);
749 <            lock.acquire(1);
750 <            assertTrue(lock.hasWaiters(c));
818 <            assertTrue(lock.getWaitingThreads(c).contains(t1));
819 <            assertTrue(lock.getWaitingThreads(c).contains(t2));
820 <            c.signalAll();
821 <            lock.release(1);
822 <            Thread.sleep(SHORT_DELAY_MS);
823 <            lock.acquire(1);
824 <            assertFalse(lock.hasWaiters(c));
825 <            assertTrue(lock.getWaitingThreads(c).isEmpty());
826 <            lock.release(1);
827 <            t1.join(SHORT_DELAY_MS);
828 <            t2.join(SHORT_DELAY_MS);
829 <            assertFalse(t1.isAlive());
830 <            assertFalse(t2.isAlive());
831 <        }
832 <        catch (Exception ex) {
833 <            unexpectedException();
834 <        }
710 >    public void testGetWaitingThreads() throws InterruptedException {
711 >        final Mutex sync = new Mutex();
712 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
713 >        Thread t1 = new Thread(new CheckedRunnable() {
714 >            public void realRun() throws InterruptedException {
715 >                sync.acquire(1);
716 >                threadAssertTrue(sync.getWaitingThreads(c).isEmpty());
717 >                c.await();
718 >                sync.release(1);
719 >            }});
720 >
721 >        Thread t2 = new Thread(new CheckedRunnable() {
722 >            public void realRun() throws InterruptedException {
723 >                sync.acquire(1);
724 >                threadAssertFalse(sync.getWaitingThreads(c).isEmpty());
725 >                c.await();
726 >                sync.release(1);
727 >            }});
728 >
729 >        sync.acquire(1);
730 >        assertTrue(sync.getWaitingThreads(c).isEmpty());
731 >        sync.release(1);
732 >        t1.start();
733 >        Thread.sleep(SHORT_DELAY_MS);
734 >        t2.start();
735 >        Thread.sleep(SHORT_DELAY_MS);
736 >        sync.acquire(1);
737 >        assertTrue(sync.hasWaiters(c));
738 >        assertTrue(sync.getWaitingThreads(c).contains(t1));
739 >        assertTrue(sync.getWaitingThreads(c).contains(t2));
740 >        c.signalAll();
741 >        sync.release(1);
742 >        Thread.sleep(SHORT_DELAY_MS);
743 >        sync.acquire(1);
744 >        assertFalse(sync.hasWaiters(c));
745 >        assertTrue(sync.getWaitingThreads(c).isEmpty());
746 >        sync.release(1);
747 >        t1.join(SHORT_DELAY_MS);
748 >        t2.join(SHORT_DELAY_MS);
749 >        assertFalse(t1.isAlive());
750 >        assertFalse(t2.isAlive());
751      }
752  
753  
# Line 839 | Line 755 | public class AbstractQueuedSynchronizerT
755      /**
756       * awaitUninterruptibly doesn't abort on interrupt
757       */
758 <    public void testAwaitUninterruptibly() {
759 <        final Mutex lock = new Mutex();
760 <        final AbstractQueuedSynchronizer.ConditionObject c = lock.newCondition();
761 <        Thread t = new Thread(new Runnable() {
762 <                public void run() {
763 <                    lock.acquire(1);
764 <                    c.awaitUninterruptibly();
765 <                    lock.release(1);
766 <                }
851 <            });
758 >    public void testAwaitUninterruptibly() throws InterruptedException {
759 >        final Mutex sync = new Mutex();
760 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
761 >        Thread t = new Thread(new CheckedRunnable() {
762 >            public void realRun() {
763 >                sync.acquire(1);
764 >                c.awaitUninterruptibly();
765 >                sync.release(1);
766 >            }});
767  
768 <        try {
769 <            t.start();
770 <            Thread.sleep(SHORT_DELAY_MS);
771 <            t.interrupt();
772 <            lock.acquire(1);
773 <            c.signal();
774 <            lock.release(1);
775 <            assert(t.isInterrupted());
861 <            t.join(SHORT_DELAY_MS);
862 <            assertFalse(t.isAlive());
863 <        }
864 <        catch (Exception ex) {
865 <            unexpectedException();
866 <        }
768 >        t.start();
769 >        Thread.sleep(SHORT_DELAY_MS);
770 >        t.interrupt();
771 >        sync.acquire(1);
772 >        c.signal();
773 >        sync.release(1);
774 >        t.join(SHORT_DELAY_MS);
775 >        assertFalse(t.isAlive());
776      }
777  
778      /**
779       * await is interruptible
780       */
781 <    public void testAwait_Interrupt() {
782 <        final Mutex lock = new Mutex();
783 <        final AbstractQueuedSynchronizer.ConditionObject c = lock.newCondition();
784 <        Thread t = new Thread(new Runnable() {
785 <                public void run() {
786 <                    try {
787 <                        lock.acquire(1);
788 <                        c.await();
789 <                        lock.release(1);
881 <                        threadShouldThrow();
882 <                    }
883 <                    catch(InterruptedException success) {
884 <                    }
885 <                }
886 <            });
781 >    public void testAwait_Interrupt() throws InterruptedException {
782 >        final Mutex sync = new Mutex();
783 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
784 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
785 >            public void realRun() throws InterruptedException {
786 >                sync.acquire(1);
787 >                c.await();
788 >                sync.release(1);
789 >            }});
790  
791 <        try {
792 <            t.start();
793 <            Thread.sleep(SHORT_DELAY_MS);
794 <            t.interrupt();
795 <            t.join(SHORT_DELAY_MS);
893 <            assertFalse(t.isAlive());
894 <        }
895 <        catch (Exception ex) {
896 <            unexpectedException();
897 <        }
791 >        t.start();
792 >        Thread.sleep(SHORT_DELAY_MS);
793 >        t.interrupt();
794 >        t.join(SHORT_DELAY_MS);
795 >        assertFalse(t.isAlive());
796      }
797  
798      /**
799       * awaitNanos is interruptible
800       */
801 <    public void testAwaitNanos_Interrupt() {
802 <        final Mutex lock = new Mutex();
803 <        final AbstractQueuedSynchronizer.ConditionObject c = lock.newCondition();
804 <        Thread t = new Thread(new Runnable() {
805 <                public void run() {
806 <                    try {
807 <                        lock.acquire(1);
808 <                        c.awaitNanos(1000 * 1000 * 1000); // 1 sec
809 <                        lock.release(1);
912 <                        threadShouldThrow();
913 <                    }
914 <                    catch(InterruptedException success) {
915 <                    }
916 <                }
917 <            });
801 >    public void testAwaitNanos_Interrupt() throws InterruptedException {
802 >        final Mutex sync = new Mutex();
803 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
804 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
805 >            public void realRun() throws InterruptedException {
806 >                sync.acquire(1);
807 >                c.awaitNanos(1000 * 1000 * 1000); // 1 sec
808 >                sync.release(1);
809 >            }});
810  
811 <        try {
812 <            t.start();
813 <            Thread.sleep(SHORT_DELAY_MS);
814 <            t.interrupt();
815 <            t.join(SHORT_DELAY_MS);
924 <            assertFalse(t.isAlive());
925 <        }
926 <        catch (Exception ex) {
927 <            unexpectedException();
928 <        }
811 >        t.start();
812 >        Thread.sleep(SHORT_DELAY_MS);
813 >        t.interrupt();
814 >        t.join(SHORT_DELAY_MS);
815 >        assertFalse(t.isAlive());
816      }
817  
818      /**
819       * awaitUntil is interruptible
820       */
821 <    public void testAwaitUntil_Interrupt() {
822 <        final Mutex lock = new Mutex();
823 <        final AbstractQueuedSynchronizer.ConditionObject c = lock.newCondition();
824 <        Thread t = new Thread(new Runnable() {
825 <                public void run() {
826 <                    try {
827 <                        lock.acquire(1);
828 <                        java.util.Date d = new java.util.Date();
829 <                        c.awaitUntil(new java.util.Date(d.getTime() + 10000));
830 <                        lock.release(1);
944 <                        threadShouldThrow();
945 <                    }
946 <                    catch(InterruptedException success) {
947 <                    }
948 <                }
949 <            });
821 >    public void testAwaitUntil_Interrupt() throws InterruptedException {
822 >        final Mutex sync = new Mutex();
823 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
824 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
825 >            public void realRun() throws InterruptedException {
826 >                sync.acquire(1);
827 >                java.util.Date d = new java.util.Date();
828 >                c.awaitUntil(new java.util.Date(d.getTime() + 10000));
829 >                sync.release(1);
830 >            }});
831  
832 <        try {
833 <            t.start();
834 <            Thread.sleep(SHORT_DELAY_MS);
835 <            t.interrupt();
836 <            t.join(SHORT_DELAY_MS);
956 <            assertFalse(t.isAlive());
957 <        }
958 <        catch (Exception ex) {
959 <            unexpectedException();
960 <        }
832 >        t.start();
833 >        Thread.sleep(SHORT_DELAY_MS);
834 >        t.interrupt();
835 >        t.join(SHORT_DELAY_MS);
836 >        assertFalse(t.isAlive());
837      }
838  
839      /**
840       * signalAll wakes up all threads
841       */
842 <    public void testSignalAll() {
843 <        final Mutex lock = new Mutex();
844 <        final AbstractQueuedSynchronizer.ConditionObject c = lock.newCondition();
845 <        Thread t1 = new Thread(new Runnable() {
846 <                public void run() {
847 <                    try {
848 <                        lock.acquire(1);
849 <                        c.await();
850 <                        lock.release(1);
851 <                    }
852 <                    catch(InterruptedException e) {
853 <                        threadUnexpectedException();
854 <                    }
855 <                }
856 <            });
857 <
858 <        Thread t2 = new Thread(new Runnable() {
859 <                public void run() {
860 <                    try {
861 <                        lock.acquire(1);
862 <                        c.await();
863 <                        lock.release(1);
864 <                    }
865 <                    catch(InterruptedException e) {
866 <                        threadUnexpectedException();
867 <                    }
868 <                }
993 <            });
994 <
995 <        try {
996 <            t1.start();
997 <            t2.start();
998 <            Thread.sleep(SHORT_DELAY_MS);
999 <            lock.acquire(1);
1000 <            c.signalAll();
1001 <            lock.release(1);
1002 <            t1.join(SHORT_DELAY_MS);
1003 <            t2.join(SHORT_DELAY_MS);
1004 <            assertFalse(t1.isAlive());
1005 <            assertFalse(t2.isAlive());
1006 <        }
1007 <        catch (Exception ex) {
1008 <            unexpectedException();
1009 <        }
842 >    public void testSignalAll() throws InterruptedException {
843 >        final Mutex sync = new Mutex();
844 >        final AbstractQueuedSynchronizer.ConditionObject c = sync.newCondition();
845 >        Thread t1 = new Thread(new CheckedRunnable() {
846 >            public void realRun() throws InterruptedException {
847 >                sync.acquire(1);
848 >                c.await();
849 >                sync.release(1);
850 >            }});
851 >
852 >        Thread t2 = new Thread(new CheckedRunnable() {
853 >            public void realRun() throws InterruptedException {
854 >                sync.acquire(1);
855 >                c.await();
856 >                sync.release(1);
857 >            }});
858 >
859 >        t1.start();
860 >        t2.start();
861 >        Thread.sleep(SHORT_DELAY_MS);
862 >        sync.acquire(1);
863 >        c.signalAll();
864 >        sync.release(1);
865 >        t1.join(SHORT_DELAY_MS);
866 >        t2.join(SHORT_DELAY_MS);
867 >        assertFalse(t1.isAlive());
868 >        assertFalse(t2.isAlive());
869      }
870  
871  
# Line 1014 | Line 873 | public class AbstractQueuedSynchronizerT
873       * toString indicates current state
874       */
875      public void testToString() {
876 <        Mutex lock = new Mutex();
877 <        String us = lock.toString();
876 >        Mutex sync = new Mutex();
877 >        String us = sync.toString();
878          assertTrue(us.indexOf("State = 0") >= 0);
879 <        lock.acquire(1);
880 <        String ls = lock.toString();
879 >        sync.acquire(1);
880 >        String ls = sync.toString();
881          assertTrue(ls.indexOf("State = 1") >= 0);
882      }
883  
884      /**
885       * A serialized AQS deserializes with current state
886       */
887 <    public void testSerialization() {
887 >    public void testSerialization() throws Exception {
888          Mutex l = new Mutex();
889          l.acquire(1);
890          assertTrue(l.isHeldExclusively());
891  
892 <        try {
893 <            ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
894 <            ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
895 <            out.writeObject(l);
896 <            out.close();
897 <
898 <            ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
899 <            ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
900 <            Mutex r = (Mutex) in.readObject();
1042 <            assertTrue(r.isHeldExclusively());
1043 <        } catch(Exception e){
1044 <            e.printStackTrace();
1045 <            unexpectedException();
1046 <        }
892 >        ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
893 >        ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
894 >        out.writeObject(l);
895 >        out.close();
896 >
897 >        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
898 >        ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
899 >        Mutex r = (Mutex) in.readObject();
900 >        assertTrue(r.isHeldExclusively());
901      }
902  
903  
# Line 1051 | Line 905 | public class AbstractQueuedSynchronizerT
905       * tryReleaseShared setting state changes getState
906       */
907      public void testGetStateWithReleaseShared() {
908 <        final BooleanLatch l = new BooleanLatch();
909 <        assertFalse(l.isSignalled());
910 <        l.releaseShared(0);
911 <        assertTrue(l.isSignalled());
908 >        final BooleanLatch l = new BooleanLatch();
909 >        assertFalse(l.isSignalled());
910 >        l.releaseShared(0);
911 >        assertTrue(l.isSignalled());
912      }
913  
914      /**
915 <     * release and has no effect when already signalled
915 >     * releaseShared has no effect when already signalled
916       */
917      public void testReleaseShared() {
918 <        final BooleanLatch l = new BooleanLatch();
919 <        assertFalse(l.isSignalled());
920 <        l.releaseShared(0);
921 <        assertTrue(l.isSignalled());
922 <        l.releaseShared(0);
923 <        assertTrue(l.isSignalled());
918 >        final BooleanLatch l = new BooleanLatch();
919 >        assertFalse(l.isSignalled());
920 >        l.releaseShared(0);
921 >        assertTrue(l.isSignalled());
922 >        l.releaseShared(0);
923 >        assertTrue(l.isSignalled());
924      }
925  
926      /**
927       * acquireSharedInterruptibly returns after release, but not before
928       */
929 <    public void testAcquireSharedInterruptibly() {
930 <        final BooleanLatch l = new BooleanLatch();
929 >    public void testAcquireSharedInterruptibly() throws InterruptedException {
930 >        final BooleanLatch l = new BooleanLatch();
931  
932 <        Thread t = new Thread(new Runnable() {
933 <                public void run() {
934 <                    try {
935 <                        threadAssertFalse(l.isSignalled());
936 <                        l.acquireSharedInterruptibly(0);
937 <                        threadAssertTrue(l.isSignalled());
938 <                    } catch(InterruptedException e){
939 <                        threadUnexpectedException();
940 <                    }
941 <                }
942 <            });
943 <        try {
944 <            t.start();
1091 <            assertFalse(l.isSignalled());
1092 <            Thread.sleep(SHORT_DELAY_MS);
1093 <            l.releaseShared(0);
1094 <            assertTrue(l.isSignalled());
1095 <            t.join();
1096 <        } catch (InterruptedException e){
1097 <            unexpectedException();
1098 <        }
932 >        Thread t = new Thread(new CheckedRunnable() {
933 >            public void realRun() throws InterruptedException {
934 >                threadAssertFalse(l.isSignalled());
935 >                l.acquireSharedInterruptibly(0);
936 >                threadAssertTrue(l.isSignalled());
937 >            }});
938 >
939 >        t.start();
940 >        assertFalse(l.isSignalled());
941 >        Thread.sleep(SHORT_DELAY_MS);
942 >        l.releaseShared(0);
943 >        assertTrue(l.isSignalled());
944 >        t.join();
945      }
946 <    
946 >
947  
948      /**
949       * acquireSharedTimed returns after release
950       */
951 <    public void testAsquireSharedTimed() {
952 <        final BooleanLatch l = new BooleanLatch();
951 >    public void testAsquireSharedTimed() throws InterruptedException {
952 >        final BooleanLatch l = new BooleanLatch();
953  
954 <        Thread t = new Thread(new Runnable() {
955 <                public void run() {
956 <                    try {
957 <                        threadAssertFalse(l.isSignalled());
958 <                        threadAssertTrue(l.tryAcquireSharedNanos(0, MEDIUM_DELAY_MS* 1000 * 1000));
959 <                        threadAssertTrue(l.isSignalled());
960 <
961 <                    } catch(InterruptedException e){
962 <                        threadUnexpectedException();
963 <                    }
964 <                }
965 <            });
966 <        try {
1121 <            t.start();
1122 <            assertFalse(l.isSignalled());
1123 <            Thread.sleep(SHORT_DELAY_MS);
1124 <            l.releaseShared(0);
1125 <            assertTrue(l.isSignalled());
1126 <            t.join();
1127 <        } catch (InterruptedException e){
1128 <            unexpectedException();
1129 <        }
954 >        Thread t = new Thread(new CheckedRunnable() {
955 >            public void realRun() throws InterruptedException {
956 >                threadAssertFalse(l.isSignalled());
957 >                threadAssertTrue(l.tryAcquireSharedNanos(0, MEDIUM_DELAY_MS* 1000 * 1000));
958 >                threadAssertTrue(l.isSignalled());
959 >            }});
960 >
961 >        t.start();
962 >        assertFalse(l.isSignalled());
963 >        Thread.sleep(SHORT_DELAY_MS);
964 >        l.releaseShared(0);
965 >        assertTrue(l.isSignalled());
966 >        t.join();
967      }
968 <    
968 >
969      /**
970       * acquireSharedInterruptibly throws IE if interrupted before released
971       */
972 <    public void testAcquireSharedInterruptibly_InterruptedException() {
972 >    public void testAcquireSharedInterruptibly_InterruptedException() throws InterruptedException {
973          final BooleanLatch l = new BooleanLatch();
974 <        Thread t = new Thread(new Runnable() {
975 <                public void run() {
976 <                    try {
977 <                        threadAssertFalse(l.isSignalled());
978 <                        l.acquireSharedInterruptibly(0);
979 <                        threadShouldThrow();
980 <                    } catch(InterruptedException success){}
981 <                }
982 <            });
983 <        t.start();
1147 <        try {
1148 <            assertFalse(l.isSignalled());
1149 <            t.interrupt();
1150 <            t.join();
1151 <        } catch (InterruptedException e){
1152 <            unexpectedException();
1153 <        }
974 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
975 >            public void realRun() throws InterruptedException {
976 >                threadAssertFalse(l.isSignalled());
977 >                l.acquireSharedInterruptibly(0);
978 >            }});
979 >
980 >        t.start();
981 >        assertFalse(l.isSignalled());
982 >        t.interrupt();
983 >        t.join();
984      }
985  
986      /**
987       * acquireSharedTimed throws IE if interrupted before released
988       */
989 <    public void testAcquireSharedNanos_InterruptedException() {
989 >    public void testAcquireSharedNanos_InterruptedException() throws InterruptedException {
990          final BooleanLatch l = new BooleanLatch();
991 <        Thread t = new Thread(new Runnable() {
992 <                public void run() {
993 <                    try {
994 <                        threadAssertFalse(l.isSignalled());
995 <                        l.tryAcquireSharedNanos(0, SMALL_DELAY_MS* 1000 * 1000);
996 <                        threadShouldThrow();                        
1167 <                    } catch(InterruptedException success){}
1168 <                }
1169 <            });
991 >        Thread t = new Thread(new CheckedInterruptedRunnable() {
992 >            public void realRun() throws InterruptedException {
993 >                threadAssertFalse(l.isSignalled());
994 >                l.tryAcquireSharedNanos(0, SMALL_DELAY_MS* 1000 * 1000);
995 >            }});
996 >
997          t.start();
998 <        try {
999 <            Thread.sleep(SHORT_DELAY_MS);
1000 <            assertFalse(l.isSignalled());
1001 <            t.interrupt();
1175 <            t.join();
1176 <        } catch (InterruptedException e){
1177 <            unexpectedException();
1178 <        }
998 >        Thread.sleep(SHORT_DELAY_MS);
999 >        assertFalse(l.isSignalled());
1000 >        t.interrupt();
1001 >        t.join();
1002      }
1003  
1004      /**
1005       * acquireSharedTimed times out if not released before timeout
1006       */
1007 <    public void testAcquireSharedNanos_Timeout() {
1007 >    public void testAcquireSharedNanos_Timeout() throws InterruptedException {
1008          final BooleanLatch l = new BooleanLatch();
1009 <        Thread t = new Thread(new Runnable() {
1010 <                public void run() {
1011 <                    try {
1012 <                        threadAssertFalse(l.isSignalled());
1013 <                        threadAssertFalse(l.tryAcquireSharedNanos(0, SMALL_DELAY_MS* 1000 * 1000));
1014 <                    } catch(InterruptedException ie){
1192 <                        threadUnexpectedException();
1193 <                    }
1194 <                }
1195 <            });
1009 >        Thread t = new Thread(new CheckedRunnable() {
1010 >            public void realRun() throws InterruptedException {
1011 >                threadAssertFalse(l.isSignalled());
1012 >                threadAssertFalse(l.tryAcquireSharedNanos(0, SMALL_DELAY_MS* 1000 * 1000));
1013 >            }});
1014 >
1015          t.start();
1016 <        try {
1017 <            Thread.sleep(SHORT_DELAY_MS);
1018 <            assertFalse(l.isSignalled());
1200 <            t.join();
1201 <        } catch (InterruptedException e){
1202 <            unexpectedException();
1203 <        }
1016 >        Thread.sleep(SHORT_DELAY_MS);
1017 >        assertFalse(l.isSignalled());
1018 >        t.join();
1019      }
1020  
1206    
1021   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines