---------------------------------------------------------------- Unincorporated changes: ---------------------------------------------------------------- changeset: 60185:50d5266f275f user: chegar date: Fri Apr 03 17:20:45 2020 +0100 summary: 8237117: Better ForkJoinPool behavior diff --git a/src/java.base/share/classes/java/util/concurrent/ForkJoinWorkerThread.java b/src/java.base/share/classes/java/util/concurrent/ForkJoinWorkerThread.java --- a/src/java.base/share/classes/java/util/concurrent/ForkJoinWorkerThread.java +++ b/src/java.base/share/classes/java/util/concurrent/ForkJoinWorkerThread.java @@ -78,6 +78,11 @@ final ForkJoinPool pool; // the pool this thread works in final ForkJoinPool.WorkQueue workQueue; // work-stealing mechanics + /** An AccessControlContext supporting no privileges */ + private static final AccessControlContext INNOCUOUS_ACC = + new AccessControlContext( + new ProtectionDomain[] { new ProtectionDomain(null, null) }); + /** * Creates a ForkJoinWorkerThread operating in the given pool. * @@ -99,6 +104,7 @@ ForkJoinWorkerThread(ForkJoinPool pool, ClassLoader ccl) { super("aForkJoinWorkerThread"); super.setContextClassLoader(ccl); + ThreadLocalRandom.setInheritedAccessControlContext(this, INNOCUOUS_ACC); this.pool = pool; this.workQueue = pool.registerWorker(this); } @@ -214,11 +220,6 @@ group, "InnocuousForkJoinWorkerThreadGroup"); }}); - /** An AccessControlContext supporting no privileges */ - private static final AccessControlContext INNOCUOUS_ACC = - new AccessControlContext( - new ProtectionDomain[] { new ProtectionDomain(null, null) }); - InnocuousForkJoinWorkerThread(ForkJoinPool pool) { super(pool, ClassLoader.getSystemClassLoader(), changeset: 60186:fea3019d444a user: smarks date: Tue Apr 07 13:27:55 2020 -0700 summary: 8231800: Better listing of arrays diff --git a/src/java.base/share/classes/java/util/ArrayList.java b/src/java.base/share/classes/java/util/ArrayList.java --- a/src/java.base/share/classes/java/util/ArrayList.java +++ b/src/java.base/share/classes/java/util/ArrayList.java @@ -178,15 +178,16 @@ * @throws NullPointerException if the specified collection is null */ public ArrayList(Collection c) { - elementData = c.toArray(); - if ((size = elementData.length) != 0) { - // defend against c.toArray (incorrectly) not returning Object[] - // (see e.g. https://bugs.openjdk.java.net/browse/JDK-6260652) - if (elementData.getClass() != Object[].class) - elementData = Arrays.copyOf(elementData, size, Object[].class); + Object[] a = c.toArray(); + if ((size = a.length) != 0) { + if (c.getClass() == ArrayList.class) { + elementData = a; + } else { + elementData = Arrays.copyOf(a, size, Object[].class); + } } else { // replace with empty array. - this.elementData = EMPTY_ELEMENTDATA; + elementData = EMPTY_ELEMENTDATA; } } diff --git a/src/java.base/share/classes/java/util/PriorityQueue.java b/src/java.base/share/classes/java/util/PriorityQueue.java --- a/src/java.base/share/classes/java/util/PriorityQueue.java +++ b/src/java.base/share/classes/java/util/PriorityQueue.java @@ -263,8 +263,7 @@ private void initElementsFromCollection(Collection c) { Object[] es = c.toArray(); int len = es.length; - // If c.toArray incorrectly doesn't return Object[], copy it. - if (es.getClass() != Object[].class) + if (c.getClass() != ArrayList.class) es = Arrays.copyOf(es, len, Object[].class); if (len == 1 || this.comparator != null) for (Object e : es) diff --git a/src/java.base/share/classes/java/util/Vector.java b/src/java.base/share/classes/java/util/Vector.java --- a/src/java.base/share/classes/java/util/Vector.java +++ b/src/java.base/share/classes/java/util/Vector.java @@ -179,12 +179,13 @@ * @since 1.2 */ public Vector(Collection c) { - elementData = c.toArray(); - elementCount = elementData.length; - // defend against c.toArray (incorrectly) not returning Object[] - // (see e.g. https://bugs.openjdk.java.net/browse/JDK-6260652) - if (elementData.getClass() != Object[].class) - elementData = Arrays.copyOf(elementData, elementCount, Object[].class); + Object[] a = c.toArray(); + elementCount = a.length; + if (c.getClass() == ArrayList.class) { + elementData = a; + } else { + elementData = Arrays.copyOf(a, elementCount, Object[].class); + } } /** diff --git a/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArrayList.java b/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArrayList.java --- a/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArrayList.java +++ b/src/java.base/share/classes/java/util/concurrent/CopyOnWriteArrayList.java @@ -36,6 +36,7 @@ import java.lang.invoke.VarHandle; import java.lang.reflect.Field; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; @@ -139,9 +140,7 @@ es = ((CopyOnWriteArrayList)c).getArray(); else { es = c.toArray(); - // defend against c.toArray (incorrectly) not returning Object[] - // (see e.g. https://bugs.openjdk.java.net/browse/JDK-6260652) - if (es.getClass() != Object[].class) + if (c.getClass() != java.util.ArrayList.class) es = Arrays.copyOf(es, es.length, Object[].class); } setArray(es); @@ -690,6 +689,9 @@ */ public int addAllAbsent(Collection c) { Object[] cs = c.toArray(); + if (c.getClass() != ArrayList.class) { + cs = cs.clone(); + } if (cs.length == 0) return 0; synchronized (lock) { @@ -741,9 +743,10 @@ Object[] es = getArray(); int len = es.length; Object[] newElements; - if (len == 0 && cs.getClass() == Object[].class) + if (len == 0 && (c.getClass() == CopyOnWriteArrayList.class || + c.getClass() == ArrayList.class)) { newElements = cs; - else { + } else { newElements = Arrays.copyOf(es, len + cs.length); System.arraycopy(cs, 0, newElements, len, cs.length); } diff --git a/src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java b/src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java --- a/src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java +++ b/src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java @@ -257,8 +257,7 @@ } Object[] es = c.toArray(); int n = es.length; - // If c.toArray incorrectly doesn't return Object[], copy it. - if (es.getClass() != Object[].class) + if (c.getClass() != java.util.ArrayList.class) es = Arrays.copyOf(es, n, Object[].class); if (screen && (n == 1 || this.comparator != null)) { for (Object e : es) changeset: 60216:bd9b43d749fd user: mr date: Wed Jul 15 14:21:54 2020 -0700 summary: 8249205: Remove unnecessary trademark symbols diff --git a/src/java.base/share/classes/java/util/concurrent/locks/Lock.java b/src/java.base/share/classes/java/util/concurrent/locks/Lock.java --- a/src/java.base/share/classes/java/util/concurrent/locks/Lock.java +++ b/src/java.base/share/classes/java/util/concurrent/locks/Lock.java @@ -123,7 +123,7 @@ * memory synchronization semantics as provided by the built-in monitor * lock, as described in * Chapter 17 of - * The Java™ Language Specification: + * The Java Language Specification: *