--- old/test/hotspot/jtreg/runtime/RedefineTests/RedefinePreviousVersions.java 2018-06-04 03:55:18.475471449 -0400 +++ new/test/hotspot/jtreg/runtime/RedefineTests/RedefinePreviousVersions.java 2018-06-04 03:55:16.955383597 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2018, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 8165246 + * @bug 8165246 8010319 * @summary Test has_previous_versions flag and processing during class unloading. * @library /test/lib * @modules java.base/jdk.internal.misc @@ -37,38 +37,43 @@ import jdk.test.lib.process.ProcessTools; import jdk.test.lib.process.OutputAnalyzer; +// package access top-level classes to avoid problem with RedefineClassHelper +// and nested types. + +class RedefinePreviousVersions_B { } + +class RedefinePreviousVersions_Running { + public static volatile boolean stop = false; + public static volatile boolean running = false; + static void localSleep() { + try { + Thread.sleep(10); // sleep for 10 ms + } catch(InterruptedException ie) { + } + } + + public static void infinite() { + running = true; + while (!stop) { localSleep(); } + } +} + + + public class RedefinePreviousVersions { public static String newB = - "class RedefinePreviousVersions$B {" + + "class RedefinePreviousVersions_B {" + "}"; - static class B { } - public static String newRunning = - "class RedefinePreviousVersions$Running {" + + "class RedefinePreviousVersions_Running {" + " public static volatile boolean stop = true;" + " public static volatile boolean running = true;" + " static void localSleep() { }" + " public static void infinite() { }" + "}"; - static class Running { - public static volatile boolean stop = false; - public static volatile boolean running = false; - static void localSleep() { - try{ - Thread.sleep(10); // sleep for 10 ms - } catch(InterruptedException ie) { - } - } - - public static void infinite() { - running = true; - while (!stop) { localSleep(); } - } - } - public static void main(String[] args) throws Exception { if (args.length > 0) { @@ -87,7 +92,7 @@ // Redefine a class and create some garbage // Since there are no methods running, the previous version is never added to the // previous_version_list and the flag _has_previous_versions should stay false - RedefineClassHelper.redefineClass(B.class, newB); + RedefineClassHelper.redefineClass(RedefinePreviousVersions_B.class, newB); for (int i = 0; i < 10 ; i++) { String s = new String("some garbage"); @@ -97,17 +102,17 @@ // Start a class that has a method running new Thread() { public void run() { - Running.infinite(); + RedefinePreviousVersions_Running.infinite(); } }.start(); - while (!Running.running) { + while (!RedefinePreviousVersions_Running.running) { Thread.sleep(10); // sleep for 10 ms } // Since a method of newRunning is running, this class should be added to the previous_version_list // of Running, and _has_previous_versions should return true at class unloading. - RedefineClassHelper.redefineClass(Running.class, newRunning); + RedefineClassHelper.redefineClass(RedefinePreviousVersions_Running.class, newRunning); for (int i = 0; i < 10 ; i++) { String s = new String("some garbage"); @@ -115,7 +120,7 @@ } // purge should clean everything up, except Xcomp it might not. - Running.stop = true; + RedefinePreviousVersions_Running.stop = true; for (int i = 0; i < 10 ; i++) { String s = new String("some garbage");