From bdbe65371d25a3c401b1164a863b357df536e032 Mon Sep 17 00:00:00 2001 From: robm Date: Fri, 16 Dec 2016 20:39:07 +0000 Subject: [PATCH] 8171388: Update JNDI Thread contexts Reviewed-by: chegar --- src/share/classes/java/lang/Thread.java | 13 ++- test/java/lang/Thread/ITLConstructor.java | 107 ++++++++++++++++++++++ 2 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 test/java/lang/Thread/ITLConstructor.java diff --git a/src/share/classes/java/lang/Thread.java b/src/share/classes/java/lang/Thread.java index 7c8e83ef2..0cd677868 100644 --- a/src/share/classes/java/lang/Thread.java +++ b/src/share/classes/java/lang/Thread.java @@ -342,11 +342,11 @@ class Thread implements Runnable { /** * Initializes a Thread with the current AccessControlContext. - * @see #init(ThreadGroup,Runnable,String,long,AccessControlContext) + * @see #init(ThreadGroup,Runnable,String,long,AccessControlContext,boolean) */ private void init(ThreadGroup g, Runnable target, String name, long stackSize) { - init(g, target, name, stackSize, null); + init(g, target, name, stackSize, null, true); } /** @@ -359,9 +359,12 @@ class Thread implements Runnable { * zero to indicate that this parameter is to be ignored. * @param acc the AccessControlContext to inherit, or * AccessController.getContext() if null + * @param inheritThreadLocals if {@code true}, inherit initial values for + * inheritable thread-locals from the constructing thread */ private void init(ThreadGroup g, Runnable target, String name, - long stackSize, AccessControlContext acc) { + long stackSize, AccessControlContext acc, + boolean inheritThreadLocals) { if (name == null) { throw new NullPointerException("name cannot be null"); } @@ -412,7 +415,7 @@ class Thread implements Runnable { acc != null ? acc : AccessController.getContext(); this.target = target; setPriority(priority); - if (parent.inheritableThreadLocals != null) + if (inheritThreadLocals && parent.inheritableThreadLocals != null) this.inheritableThreadLocals = ThreadLocal.createInheritedMap(parent.inheritableThreadLocals); /* Stash the specified stack size in case the VM cares */ @@ -466,7 +469,7 @@ class Thread implements Runnable { * This is not a public constructor. */ Thread(Runnable target, AccessControlContext acc) { - init(null, target, "Thread-" + nextThreadNum(), 0, acc); + init(null, target, "Thread-" + nextThreadNum(), 0, acc, false); } /** diff --git a/test/java/lang/Thread/ITLConstructor.java b/test/java/lang/Thread/ITLConstructor.java new file mode 100644 index 000000000..1a24f0a15 --- /dev/null +++ b/test/java/lang/Thread/ITLConstructor.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @summary Basic test for Thread(ThreadGroup,Runnable,String,long,boolean) + */ + +import sun.misc.SharedSecrets; + +import java.security.AccessControlContext; +import java.security.AccessController; +import java.security.PrivilegedAction; + +public class ITLConstructor { + static InheritableThreadLocal n = new InheritableThreadLocal() { + protected Integer initialValue() { + return 0; + } + + protected Integer childValue(Integer parentValue) { + return parentValue + 1; + } + }; + + static final int CHILD_THREAD_COUNT = 10; + + public static void main(String args[]) throws Exception { + test(); + } + + static void test() throws Exception { + // concurrent access to separate indexes is ok + int[] x = new int[CHILD_THREAD_COUNT]; + Thread child = createThread(new AnotherRunnable(0, x)); + child.start(); + child.join(); // waits for *all* threads to complete + + // Check results + for(int i=0; i() { + public Thread run() { + return SharedSecrets.getJavaLangAccess() + .newThreadWithAcc(r, acc); + } + } + ); + } +} -- GitLab