8351327: -XX:AOTMode=record interferes with application execution
Reviewed-by: shade, kvn, matsaave
This commit is contained in:
parent
41cc049f42
commit
a7ad4144c8
@ -561,7 +561,7 @@ bool CDSConfig::is_dumping_final_static_archive() {
|
|||||||
|
|
||||||
bool CDSConfig::allow_only_single_java_thread() {
|
bool CDSConfig::allow_only_single_java_thread() {
|
||||||
// See comments in JVM_StartThread()
|
// See comments in JVM_StartThread()
|
||||||
return is_dumping_static_archive();
|
return is_dumping_classic_static_archive() || is_dumping_final_static_archive();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CDSConfig::is_using_archive() {
|
bool CDSConfig::is_using_archive() {
|
||||||
|
@ -823,8 +823,10 @@ void MetaspaceShared::preload_and_dump(TRAPS) {
|
|||||||
|
|
||||||
if (CDSConfig::new_aot_flags_used()) {
|
if (CDSConfig::new_aot_flags_used()) {
|
||||||
if (CDSConfig::is_dumping_preimage_static_archive()) {
|
if (CDSConfig::is_dumping_preimage_static_archive()) {
|
||||||
|
// We are in the JVM that runs the training run. Continue execution,
|
||||||
|
// so that it can finish all clean-up and return the correct exit
|
||||||
|
// code to the OS.
|
||||||
tty->print_cr("AOTConfiguration recorded: %s", AOTConfiguration);
|
tty->print_cr("AOTConfiguration recorded: %s", AOTConfiguration);
|
||||||
vm_exit(0);
|
|
||||||
} else {
|
} else {
|
||||||
// The JLI launcher only recognizes the "old" -Xshare:dump flag.
|
// The JLI launcher only recognizes the "old" -Xshare:dump flag.
|
||||||
// When the new -XX:AOTMode=create flag is used, we can't return
|
// When the new -XX:AOTMode=create flag is used, we can't return
|
||||||
|
@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2025, 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 -XX:AOTMode=record should not interfere with app execution: (1) thread creation; (2) exit code
|
||||||
|
* @bug 8351327
|
||||||
|
* @requires vm.cds.supports.aot.class.linking
|
||||||
|
* @comment work around JDK-8345635
|
||||||
|
* @requires !vm.jvmci.enabled
|
||||||
|
* @library /test/jdk/lib/testlibrary /test/lib
|
||||||
|
* @build TrainingRun
|
||||||
|
* @run driver jdk.test.lib.helpers.ClassFileInstaller -jar app.jar MyTestApp
|
||||||
|
* @run driver TrainingRun AOT
|
||||||
|
*/
|
||||||
|
|
||||||
|
import jdk.test.lib.cds.CDSAppTester;
|
||||||
|
import jdk.test.lib.helpers.ClassFileInstaller;
|
||||||
|
import jdk.test.lib.process.OutputAnalyzer;
|
||||||
|
|
||||||
|
public class TrainingRun {
|
||||||
|
static final String appJar = ClassFileInstaller.getJarPath("app.jar");
|
||||||
|
static final String mainClass = "MyTestApp";
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
(new Tester()).run(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
static class Tester extends CDSAppTester {
|
||||||
|
public Tester() {
|
||||||
|
super(mainClass);
|
||||||
|
|
||||||
|
// CDSAppTester usually wants the app to return exit value 0, but this test
|
||||||
|
// checks whether the training run can return 2.
|
||||||
|
setCheckExitValue(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String classpath(RunMode runMode) {
|
||||||
|
return appJar;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] appCommandLine(RunMode runMode) {
|
||||||
|
return new String[] {
|
||||||
|
mainClass,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void checkExecution(OutputAnalyzer out, RunMode runMode) {
|
||||||
|
if (runMode.isApplicationExecuted()) {
|
||||||
|
out.shouldHaveExitValue(2);
|
||||||
|
out.shouldContain("Hello: x is 1");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class MyTestApp {
|
||||||
|
volatile static int x = 0;
|
||||||
|
|
||||||
|
public static void main(String args[]) throws Exception {
|
||||||
|
Thread t = new Thread(() -> {
|
||||||
|
x = 1;
|
||||||
|
});
|
||||||
|
t.start();
|
||||||
|
t.join();
|
||||||
|
|
||||||
|
if (x != 1) {
|
||||||
|
throw new RuntimeException("x should be 1 but is " + x);
|
||||||
|
}
|
||||||
|
System.out.println("Hello: x is " + x);
|
||||||
|
System.out.println("I am calling System.exit(2)");
|
||||||
|
System.exit(2);
|
||||||
|
}
|
||||||
|
}
|
@ -56,7 +56,6 @@ abstract public class CDSAppTester {
|
|||||||
throw new SkippedException("Tests based on CDSAppTester should be excluded when -Dtest.dynamic.cds.archive is specified");
|
throw new SkippedException("Tests based on CDSAppTester should be excluded when -Dtest.dynamic.cds.archive is specified");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Old workflow
|
|
||||||
this.name = name;
|
this.name = name;
|
||||||
classListFile = name() + ".classlist";
|
classListFile = name() + ".classlist";
|
||||||
classListFileLog = classListFile + ".log";
|
classListFileLog = classListFile + ".log";
|
||||||
@ -89,7 +88,7 @@ abstract public class CDSAppTester {
|
|||||||
TRAINING, // -XX:DumpLoadedClassList OR {-XX:AOTMode=create -XX:AOTConfiguration}
|
TRAINING, // -XX:DumpLoadedClassList OR {-XX:AOTMode=create -XX:AOTConfiguration}
|
||||||
DUMP_STATIC, // -Xshare:dump
|
DUMP_STATIC, // -Xshare:dump
|
||||||
DUMP_DYNAMIC, // -XX:ArchiveClassesArExit
|
DUMP_DYNAMIC, // -XX:ArchiveClassesArExit
|
||||||
ASSEMBLY, // JEP 483
|
ASSEMBLY, // JEP 483 (assembly phase, app logic not executed)
|
||||||
PRODUCTION; // Running with the CDS archive produced from the above steps
|
PRODUCTION; // Running with the CDS archive produced from the above steps
|
||||||
|
|
||||||
public boolean isStaticDump() {
|
public boolean isStaticDump() {
|
||||||
@ -98,6 +97,24 @@ abstract public class CDSAppTester {
|
|||||||
public boolean isProductionRun() {
|
public boolean isProductionRun() {
|
||||||
return this == PRODUCTION;
|
return this == PRODUCTION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// When <code>CDSAppTester::checkExecution(out, runMode)</code> is called, has the application been
|
||||||
|
// executed? If so, <code>out</code> should contain logs printed by the application's own logic.
|
||||||
|
public boolean isApplicationExecuted() {
|
||||||
|
return (this != ASSEMBLY) && (this != DUMP_STATIC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDumping(RunMode runMode) {
|
||||||
|
if (isStaticWorkflow()) {
|
||||||
|
return runMode == RunMode.DUMP_STATIC;
|
||||||
|
} else if (isDynamicWorkflow()) {
|
||||||
|
return runMode == RunMode.DUMP_DYNAMIC;
|
||||||
|
} else if (isAOTWorkflow()) {
|
||||||
|
return runMode == RunMode.TRAINING || runMode == RunMode.ASSEMBLY;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public final String name() {
|
public final String name() {
|
||||||
@ -184,7 +201,9 @@ abstract public class CDSAppTester {
|
|||||||
"-XX:AOTConfiguration=" + aotConfigurationFile,
|
"-XX:AOTConfiguration=" + aotConfigurationFile,
|
||||||
"-cp", classpath(runMode),
|
"-cp", classpath(runMode),
|
||||||
logToFile(aotConfigurationFileLog,
|
logToFile(aotConfigurationFileLog,
|
||||||
"class+load=debug"));
|
"class+load=debug",
|
||||||
|
"cds=debug",
|
||||||
|
"cds+class=debug"));
|
||||||
cmdLine = StringArrayUtils.concat(cmdLine, appCommandLine(runMode));
|
cmdLine = StringArrayUtils.concat(cmdLine, appCommandLine(runMode));
|
||||||
return executeAndCheck(cmdLine, runMode, aotConfigurationFile, aotConfigurationFileLog);
|
return executeAndCheck(cmdLine, runMode, aotConfigurationFile, aotConfigurationFileLog);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user