ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LockSupportTest.java
Revision: 1.28
Committed: Fri May 12 18:23:11 2017 UTC (7 years ago) by jsr166
Branch: MAIN
Changes since 1.27: +2 -2 lines
Log Message:
prefer Thread.interrupted() to Thread.isInterrupted() where possible

File Contents

# User Rev Content
1 dl 1.1 /*
2 jsr166 1.15 * Written by Doug Lea and Martin Buchholz with assistance from
3     * members of JCP JSR-166 Expert Group and released to the public
4     * domain, as explained at
5 jsr166 1.18 * http://creativecommons.org/publicdomain/zero/1.0/
6 jsr166 1.8 * Other contributors include Andrew Wright, Jeffrey Hayes,
7     * Pat Fisher, Mike Judd.
8 dl 1.1 */
9    
10 jsr166 1.24 import static java.util.concurrent.TimeUnit.MILLISECONDS;
11    
12 jsr166 1.23 import java.util.concurrent.CountDownLatch;
13 jsr166 1.15 import java.util.concurrent.atomic.AtomicBoolean;
14 jsr166 1.23 import java.util.concurrent.locks.LockSupport;
15 jsr166 1.24
16     import junit.framework.Test;
17     import junit.framework.TestSuite;
18 dl 1.1
19 jsr166 1.10 public class LockSupportTest extends JSR166TestCase {
20 dl 1.1 public static void main(String[] args) {
21 jsr166 1.25 main(suite(), args);
22 dl 1.1 }
23 jsr166 1.15
24 dl 1.1 public static Test suite() {
25 jsr166 1.12 return new TestSuite(LockSupportTest.class);
26 dl 1.1 }
27    
28 jsr166 1.26 static {
29     // Reduce the risk of rare disastrous classloading in first call to
30     // LockSupport.park: https://bugs.openjdk.java.net/browse/JDK-8074773
31     Class<?> ensureLoaded = LockSupport.class;
32     }
33    
34 dl 1.3 /**
35 jsr166 1.23 * Returns the blocker object used by tests in this file.
36     * Any old object will do; we'll return a convenient one.
37 dl 1.3 */
38 jsr166 1.23 static Object theBlocker() {
39     return LockSupportTest.class;
40     }
41    
42     enum ParkMethod {
43     park() {
44     void park() {
45 jsr166 1.11 LockSupport.park();
46 jsr166 1.23 }
47     void park(long millis) {
48     throw new UnsupportedOperationException();
49     }
50     },
51     parkUntil() {
52     void park(long millis) {
53     LockSupport.parkUntil(deadline(millis));
54     }
55     },
56     parkNanos() {
57     void park(long millis) {
58     LockSupport.parkNanos(MILLISECONDS.toNanos(millis));
59     }
60     },
61     parkBlocker() {
62     void park() {
63     LockSupport.park(theBlocker());
64     }
65     void park(long millis) {
66     throw new UnsupportedOperationException();
67     }
68     },
69     parkUntilBlocker() {
70     void park(long millis) {
71     LockSupport.parkUntil(theBlocker(), deadline(millis));
72     }
73     },
74     parkNanosBlocker() {
75     void park(long millis) {
76     LockSupport.parkNanos(theBlocker(),
77     MILLISECONDS.toNanos(millis));
78     }
79     };
80    
81     void park() { park(2 * LONG_DELAY_MS); }
82     abstract void park(long millis);
83    
84     /** Returns a deadline to use with parkUntil. */
85     long deadline(long millis) {
86     // beware of rounding
87     return System.currentTimeMillis() + millis + 1;
88     }
89 jsr166 1.15 }
90    
91     /**
92 jsr166 1.23 * park is released by subsequent unpark
93 jsr166 1.15 */
94 jsr166 1.23 public void testParkBeforeUnpark_park() {
95     testParkBeforeUnpark(ParkMethod.park);
96     }
97     public void testParkBeforeUnpark_parkNanos() {
98     testParkBeforeUnpark(ParkMethod.parkNanos);
99     }
100     public void testParkBeforeUnpark_parkUntil() {
101     testParkBeforeUnpark(ParkMethod.parkUntil);
102     }
103     public void testParkBeforeUnpark_parkBlocker() {
104     testParkBeforeUnpark(ParkMethod.parkBlocker);
105     }
106     public void testParkBeforeUnpark_parkNanosBlocker() {
107     testParkBeforeUnpark(ParkMethod.parkNanosBlocker);
108     }
109     public void testParkBeforeUnpark_parkUntilBlocker() {
110     testParkBeforeUnpark(ParkMethod.parkUntilBlocker);
111 jsr166 1.15 }
112 jsr166 1.23 public void testParkBeforeUnpark(final ParkMethod parkMethod) {
113     final CountDownLatch pleaseUnpark = new CountDownLatch(1);
114 jsr166 1.16 Thread t = newStartedThread(new CheckedRunnable() {
115 jsr166 1.15 public void realRun() {
116 jsr166 1.23 pleaseUnpark.countDown();
117     parkMethod.park();
118 jsr166 1.15 }});
119    
120 jsr166 1.23 await(pleaseUnpark);
121 jsr166 1.11 LockSupport.unpark(t);
122 jsr166 1.23 awaitTermination(t);
123 dl 1.1 }
124    
125 dl 1.3 /**
126 jsr166 1.15 * park is released by preceding unpark
127 dl 1.4 */
128 jsr166 1.23 public void testParkAfterUnpark_park() {
129     testParkAfterUnpark(ParkMethod.park);
130     }
131     public void testParkAfterUnpark_parkNanos() {
132     testParkAfterUnpark(ParkMethod.parkNanos);
133     }
134     public void testParkAfterUnpark_parkUntil() {
135     testParkAfterUnpark(ParkMethod.parkUntil);
136     }
137     public void testParkAfterUnpark_parkBlocker() {
138     testParkAfterUnpark(ParkMethod.parkBlocker);
139     }
140     public void testParkAfterUnpark_parkNanosBlocker() {
141     testParkAfterUnpark(ParkMethod.parkNanosBlocker);
142 dl 1.4 }
143 jsr166 1.23 public void testParkAfterUnpark_parkUntilBlocker() {
144     testParkAfterUnpark(ParkMethod.parkUntilBlocker);
145 jsr166 1.15 }
146 jsr166 1.23 public void testParkAfterUnpark(final ParkMethod parkMethod) {
147     final CountDownLatch pleaseUnpark = new CountDownLatch(1);
148     final AtomicBoolean pleasePark = new AtomicBoolean(false);
149 jsr166 1.16 Thread t = newStartedThread(new CheckedRunnable() {
150 jsr166 1.23 public void realRun() {
151     pleaseUnpark.countDown();
152     while (!pleasePark.get())
153 jsr166 1.15 Thread.yield();
154 jsr166 1.23 parkMethod.park();
155 jsr166 1.15 }});
156    
157 jsr166 1.23 await(pleaseUnpark);
158 jsr166 1.15 LockSupport.unpark(t);
159 jsr166 1.23 pleasePark.set(true);
160     awaitTermination(t);
161 jsr166 1.15 }
162    
163     /**
164     * park is released by subsequent interrupt
165     */
166 jsr166 1.23 public void testParkBeforeInterrupt_park() {
167     testParkBeforeInterrupt(ParkMethod.park);
168     }
169     public void testParkBeforeInterrupt_parkNanos() {
170     testParkBeforeInterrupt(ParkMethod.parkNanos);
171     }
172     public void testParkBeforeInterrupt_parkUntil() {
173     testParkBeforeInterrupt(ParkMethod.parkUntil);
174     }
175     public void testParkBeforeInterrupt_parkBlocker() {
176     testParkBeforeInterrupt(ParkMethod.parkBlocker);
177     }
178     public void testParkBeforeInterrupt_parkNanosBlocker() {
179     testParkBeforeInterrupt(ParkMethod.parkNanosBlocker);
180     }
181     public void testParkBeforeInterrupt_parkUntilBlocker() {
182     testParkBeforeInterrupt(ParkMethod.parkUntilBlocker);
183     }
184     public void testParkBeforeInterrupt(final ParkMethod parkMethod) {
185     final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
186 jsr166 1.16 Thread t = newStartedThread(new CheckedRunnable() {
187 jsr166 1.12 public void realRun() {
188 jsr166 1.23 pleaseInterrupt.countDown();
189 jsr166 1.17 do {
190 jsr166 1.23 parkMethod.park();
191 jsr166 1.17 // park may return spuriously
192 jsr166 1.28 } while (! Thread.interrupted());
193 jsr166 1.15 }});
194    
195 jsr166 1.23 await(pleaseInterrupt);
196     assertThreadStaysAlive(t);
197 jsr166 1.15 t.interrupt();
198 jsr166 1.23 awaitTermination(t);
199 jsr166 1.15 }
200    
201     /**
202 jsr166 1.23 * park is released by preceding interrupt
203 jsr166 1.15 */
204 jsr166 1.23 public void testParkAfterInterrupt_park() {
205     testParkAfterInterrupt(ParkMethod.park);
206     }
207     public void testParkAfterInterrupt_parkNanos() {
208     testParkAfterInterrupt(ParkMethod.parkNanos);
209     }
210     public void testParkAfterInterrupt_parkUntil() {
211     testParkAfterInterrupt(ParkMethod.parkUntil);
212     }
213     public void testParkAfterInterrupt_parkBlocker() {
214     testParkAfterInterrupt(ParkMethod.parkBlocker);
215     }
216     public void testParkAfterInterrupt_parkNanosBlocker() {
217     testParkAfterInterrupt(ParkMethod.parkNanosBlocker);
218 dl 1.4 }
219 jsr166 1.23 public void testParkAfterInterrupt_parkUntilBlocker() {
220     testParkAfterInterrupt(ParkMethod.parkUntilBlocker);
221 jsr166 1.15 }
222 jsr166 1.23 public void testParkAfterInterrupt(final ParkMethod parkMethod) {
223     final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
224     final AtomicBoolean pleasePark = new AtomicBoolean(false);
225 jsr166 1.16 Thread t = newStartedThread(new CheckedRunnable() {
226 jsr166 1.15 public void realRun() throws Exception {
227 jsr166 1.23 pleaseInterrupt.countDown();
228     while (!pleasePark.get())
229 jsr166 1.15 Thread.yield();
230     assertTrue(Thread.currentThread().isInterrupted());
231 jsr166 1.23 parkMethod.park();
232 jsr166 1.15 assertTrue(Thread.currentThread().isInterrupted());
233     }});
234    
235 jsr166 1.23 await(pleaseInterrupt);
236 jsr166 1.15 t.interrupt();
237 jsr166 1.23 pleasePark.set(true);
238     awaitTermination(t);
239 jsr166 1.15 }
240    
241     /**
242 jsr166 1.23 * timed park times out if not unparked
243 jsr166 1.15 */
244 jsr166 1.23 public void testParkTimesOut_parkNanos() {
245     testParkTimesOut(ParkMethod.parkNanos);
246     }
247     public void testParkTimesOut_parkUntil() {
248     testParkTimesOut(ParkMethod.parkUntil);
249     }
250     public void testParkTimesOut_parkNanosBlocker() {
251     testParkTimesOut(ParkMethod.parkNanosBlocker);
252     }
253     public void testParkTimesOut_parkUntilBlocker() {
254     testParkTimesOut(ParkMethod.parkUntilBlocker);
255     }
256     public void testParkTimesOut(final ParkMethod parkMethod) {
257 jsr166 1.16 Thread t = newStartedThread(new CheckedRunnable() {
258 jsr166 1.23 public void realRun() {
259 jsr166 1.27 for (int tries = MAX_SPURIOUS_WAKEUPS; tries-->0; ) {
260 jsr166 1.23 long startTime = System.nanoTime();
261     parkMethod.park(timeoutMillis());
262     // park may return spuriously
263     if (millisElapsedSince(startTime) >= timeoutMillis())
264     return;
265     }
266 jsr166 1.27 fail("too many consecutive spurious wakeups?");
267 jsr166 1.15 }});
268    
269 jsr166 1.23 awaitTermination(t);
270 jsr166 1.15 }
271    
272     /**
273 jsr166 1.23 * getBlocker(null) throws NullPointerException
274 jsr166 1.15 */
275 jsr166 1.23 public void testGetBlockerNull() {
276     try {
277     LockSupport.getBlocker(null);
278     shouldThrow();
279     } catch (NullPointerException success) {}
280 dl 1.4 }
281    
282     /**
283 jsr166 1.23 * getBlocker returns the blocker object passed to park
284 dl 1.3 */
285 jsr166 1.23 public void testGetBlocker_parkBlocker() {
286     testGetBlocker(ParkMethod.parkBlocker);
287     }
288     public void testGetBlocker_parkNanosBlocker() {
289     testGetBlocker(ParkMethod.parkNanosBlocker);
290     }
291     public void testGetBlocker_parkUntilBlocker() {
292     testGetBlocker(ParkMethod.parkUntilBlocker);
293     }
294     public void testGetBlocker(final ParkMethod parkMethod) {
295     final CountDownLatch started = new CountDownLatch(1);
296 jsr166 1.16 Thread t = newStartedThread(new CheckedRunnable() {
297 jsr166 1.12 public void realRun() {
298 jsr166 1.23 Thread t = Thread.currentThread();
299     started.countDown();
300     do {
301     assertNull(LockSupport.getBlocker(t));
302     parkMethod.park();
303     assertNull(LockSupport.getBlocker(t));
304     // park may return spuriously
305 jsr166 1.28 } while (! Thread.interrupted());
306 jsr166 1.11 }});
307    
308 jsr166 1.23 long startTime = System.nanoTime();
309     await(started);
310     for (;;) {
311     Object x = LockSupport.getBlocker(t);
312     if (x == theBlocker()) { // success
313     t.interrupt();
314     awaitTermination(t);
315     assertNull(LockSupport.getBlocker(t));
316     return;
317     } else {
318     assertNull(x); // ok
319     if (millisElapsedSince(startTime) > LONG_DELAY_MS)
320     fail("timed out");
321     Thread.yield();
322     }
323     }
324 dl 1.1 }
325    
326 dl 1.3 /**
327 jsr166 1.23 * timed park(0) returns immediately.
328     *
329     * Requires hotspot fix for:
330     * 6763959 java.util.concurrent.locks.LockSupport.parkUntil(0) blocks forever
331     * which is in jdk7-b118 and 6u25.
332 dl 1.3 */
333 jsr166 1.23 public void testPark0_parkNanos() {
334     testPark0(ParkMethod.parkNanos);
335     }
336     public void testPark0_parkUntil() {
337     testPark0(ParkMethod.parkUntil);
338     }
339     public void testPark0_parkNanosBlocker() {
340     testPark0(ParkMethod.parkNanosBlocker);
341     }
342     public void testPark0_parkUntilBlocker() {
343     testPark0(ParkMethod.parkUntilBlocker);
344     }
345     public void testPark0(final ParkMethod parkMethod) {
346 jsr166 1.16 Thread t = newStartedThread(new CheckedRunnable() {
347 jsr166 1.12 public void realRun() {
348 jsr166 1.23 parkMethod.park(0L);
349 jsr166 1.15 }});
350    
351 jsr166 1.23 awaitTermination(t);
352 jsr166 1.15 }
353    
354     /**
355 jsr166 1.23 * timed park(Long.MIN_VALUE) returns immediately.
356 jsr166 1.20 */
357 jsr166 1.23 public void testParkNeg_parkNanos() {
358     testParkNeg(ParkMethod.parkNanos);
359     }
360     public void testParkNeg_parkUntil() {
361     testParkNeg(ParkMethod.parkUntil);
362     }
363     public void testParkNeg_parkNanosBlocker() {
364     testParkNeg(ParkMethod.parkNanosBlocker);
365     }
366     public void testParkNeg_parkUntilBlocker() {
367     testParkNeg(ParkMethod.parkUntilBlocker);
368 jsr166 1.20 }
369 jsr166 1.23 public void testParkNeg(final ParkMethod parkMethod) {
370 jsr166 1.16 Thread t = newStartedThread(new CheckedRunnable() {
371 jsr166 1.15 public void realRun() {
372 jsr166 1.23 parkMethod.park(Long.MIN_VALUE);
373 jsr166 1.11 }});
374    
375 jsr166 1.21 awaitTermination(t);
376 dl 1.1 }
377     }