ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/ForkJoinPool9Test.java
Revision: 1.10
Committed: Tue Mar 22 21:29:24 2022 UTC (2 years, 1 month ago) by dl
Branch: MAIN
CVS Tags: HEAD
Changes since 1.9: +1 -0 lines
Log Message:
Updates for jdk17+

File Contents

# Content
1 /*
2 * 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 * http://creativecommons.org/publicdomain/zero/1.0/
6 */
7
8 import java.lang.invoke.MethodHandles;
9 import java.lang.invoke.VarHandle;
10 import java.util.concurrent.CountDownLatch;
11 import java.util.concurrent.ForkJoinPool;
12 import java.util.concurrent.ForkJoinTask;
13 import java.util.concurrent.Future;
14 import java.util.stream.Stream;
15
16 import junit.framework.Test;
17 import junit.framework.TestSuite;
18
19 public class ForkJoinPool9Test extends JSR166TestCase {
20 public static void main(String[] args) {
21 main(suite(), args);
22 }
23
24 public static Test suite() {
25 return new TestSuite(ForkJoinPool9Test.class);
26 }
27
28 /**
29 * Check handling of common pool thread context class loader
30 */
31 @SuppressWarnings("removal")
32 public void testCommonPoolThreadContextClassLoader() throws Throwable {
33 if (!testImplementationDetails) return;
34
35 // Ensure common pool has at least one real thread
36 String prop = System.getProperty(
37 "java.util.concurrent.ForkJoinPool.common.parallelism");
38 if ("0".equals(prop)) return;
39
40 VarHandle CCL =
41 MethodHandles.privateLookupIn(Thread.class, MethodHandles.lookup())
42 .findVarHandle(Thread.class, "contextClassLoader", ClassLoader.class);
43 ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
44 boolean haveSecurityManager = (System.getSecurityManager() != null);
45 CountDownLatch runInCommonPoolStarted = new CountDownLatch(1);
46 ClassLoader classLoaderDistinctFromSystemClassLoader
47 = ClassLoader.getPlatformClassLoader();
48 assertNotSame(classLoaderDistinctFromSystemClassLoader,
49 systemClassLoader);
50 Runnable runInCommonPool = () -> {
51 runInCommonPoolStarted.countDown();
52 assertTrue(ForkJoinTask.inForkJoinPool());
53 assertSame(ForkJoinPool.commonPool(), ForkJoinTask.getPool());
54 Thread currentThread = Thread.currentThread();
55
56 Stream.of(systemClassLoader, null).forEach(cl -> {
57 if (randomBoolean())
58 // should always be permitted, without effect
59 currentThread.setContextClassLoader(cl);
60 });
61
62 Stream.of(currentThread.getContextClassLoader(),
63 (ClassLoader) CCL.get(currentThread))
64 .forEach(cl -> assertTrue(cl == systemClassLoader || cl == null));
65
66 if (haveSecurityManager)
67 assertThrows(
68 SecurityException.class,
69 () -> System.getProperty("foo"),
70 () -> currentThread.setContextClassLoader(
71 classLoaderDistinctFromSystemClassLoader));
72 // TODO ?
73 // if (haveSecurityManager
74 // && Thread.currentThread().getClass().getSimpleName()
75 // .equals("InnocuousForkJoinWorkerThread"))
76 // assertThrows(SecurityException.class, /* ?? */);
77 };
78 Future<?> f = ForkJoinPool.commonPool().submit(runInCommonPool);
79 // Ensure runInCommonPool is truly running in the common pool,
80 // by giving this thread no opportunity to "help" on get().
81 await(runInCommonPoolStarted);
82 assertNull(f.get());
83 }
84
85 }