/* * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2018, Amazon and/or its affiliates. All rights reserved. * Copyright (c) 2016-2019, Azul Systems, Inc. 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 * @library /test/lib * @run main/othervm Test8231584 */ import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.Path; import jdk.test.lib.compiler.CompilerUtils; public class Test8231584 { static Thread thread1 = null; static Thread thread2 = null; static volatile boolean thread1Ready = false; private static final String TEST_SRC = System.getProperty("test.src"); private static final Path SRC_DIR = Paths.get(TEST_SRC, "classes"); private static final Path CLS_DIR = Paths.get("classes"); static ClassLoader loader = new TestClassLoader2(); static void someLibLoad() { try { /* FileSystems.getDefault(); // jdk/jdk: loads directly from Bootstrap Classloader (doesn't take lock on Runtime) java.net.NetworkInterface.getNetworkInterfaces(); System.out.println(jdk.net.ExtendedSocketOptions.SO_FLOW_SLA); */ Class c = Class.forName("Target2", true, loader); } catch (Exception e) { e.printStackTrace(); } } static void exitFailed() { System.exit(1); } static void exitPassed() { System.exit(95); } static class TestClassLoader2 extends ClassLoader { public String findLibrary(String name) { System.out.println("findLibrary " + name); if ("someLibrary".equals(name)) { try { synchronized(thread1) { while(!thread1Ready) { thread1.wait(); } thread1.notifyAll(); } Thread.sleep(10000); System.out.println("Thread2 load"); someLibLoad(); } catch (Exception e) { } // Finish the test exitPassed(); return null; } return super.findLibrary(name); } public Class findClass(String name) throws ClassNotFoundException { System.out.println("findClass2 " + name); Path thisClass = CLS_DIR.resolve(name + ".class"); if (!Files.exists(thisClass)) { return super.findClass(name); } byte[] b = null; try { b = Files.readAllBytes(thisClass); } catch(Exception e) { return null; } return defineClass(null, b, 0, b.length); } } public static void main(String[] args) throws Exception { if (!CompilerUtils.compile(SRC_DIR, CLS_DIR)) { throw new Exception("Can't compile"); } thread1 = new Thread() { public void run() { try { synchronized(this) { thread1Ready = true; thread1.notifyAll(); thread1.wait(); } } catch(InterruptedException e) { System.out.println("thread1 " + e); return; } System.out.println("Thread1 load"); someLibLoad(); }; }; thread2 = new Thread() { public void run() { try { Class c = Class.forName("Target", true, loader); System.out.println(c); } catch (Exception e) { System.out.println("thread2 " + e); return; } }; }; thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { System.out.println("interrupted"); exitFailed(); } } }