-
Notifications
You must be signed in to change notification settings - Fork 42
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Wisp] Compatibility support with CDS.
Summary: Follow the rule to support CDS in wisp flow: 1. add serialize function 2. use macro 3. call serialize function when coroutine is enable. Test Plan: test/jdk/com/alibaba/cds/TestDumpAndLoadClassWithWisp.java test/jdk/com/alibaba/cds/TestWispWithAppCDS.java all wisp cases all cds cases Reviewed-by: yulei Issue: #112
- Loading branch information
Showing
7 changed files
with
365 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
158 changes: 158 additions & 0 deletions
158
test/jdk/com/alibaba/cds/TestDumpAndLoadClassWithWisp.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,158 @@ | ||
/* | ||
* @test | ||
* @summary Test EagerAppCDS Flow with wisp | ||
* @library /lib/testlibrary /test/lib | ||
* @modules java.base/jdk.internal.access | ||
* java.management | ||
* jdk.jartool/sun.tools.jar | ||
* @modules jdk.compiler | ||
* @modules java.base/com.alibaba.util:+open | ||
* @build Classes4CDS | ||
* @build TestSimple | ||
* @build TestClassLoaderWithSignature | ||
* @run driver ClassFileInstaller -jar test.jar TestClassLoaderWithSignature | ||
* @run main/othervm -XX:+UnlockExperimentalVMOptions TestDumpAndLoadClassWithWisp | ||
*/ | ||
|
||
import jdk.test.lib.cds.CDSTestUtils; | ||
import jdk.test.lib.process.OutputAnalyzer; | ||
import jdk.test.lib.process.ProcessTools; | ||
|
||
import java.util.ArrayList; | ||
import java.util.List; | ||
import java.io.*; | ||
|
||
public class TestDumpAndLoadClassWithWisp { | ||
|
||
private static final String TESTJAR = "./test.jar"; | ||
private static final String TESTNAME = "TestClassLoaderWithSignature"; | ||
private static final String TESTCLASS = TESTNAME + ".class"; | ||
|
||
private static final String CLASSLIST_FILE = "./TestDumpAndLoadClassWithWisp.classlist"; | ||
private static final String CLASSLIST_FILE_2 = "./TestDumpAndLoadClassWithWisp.classlist2"; | ||
private static final String ARCHIVE_FILE = "./TestDumpAndLoadClassWithWisp.jsa"; | ||
private static final String BOOTCLASS = "java.lang.Class"; | ||
private static final String TEST_CLASS = System.getProperty("test.classes"); | ||
|
||
public static void main(String[] args) throws Exception { | ||
|
||
// dump loaded classes into a classlist file | ||
dumpLoadedClasses(new String[] { BOOTCLASS, TESTNAME }); | ||
|
||
convertClassList(); | ||
|
||
// create an archive using the classlist | ||
dumpArchive(); | ||
|
||
// start the java process with shared archive file | ||
startWithJsa(); | ||
} | ||
|
||
public static List<String> toClassNames(String filename) throws IOException { | ||
ArrayList<String> classes = new ArrayList<>(); | ||
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filename)))) { | ||
for (; ; ) { | ||
String line = br.readLine(); | ||
if (line == null) { | ||
break; | ||
} | ||
classes.add(line.replaceAll("/", ".")); | ||
} | ||
} | ||
return classes; | ||
} | ||
|
||
static void dumpLoadedClasses(String[] expectedClasses) throws Exception { | ||
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, | ||
"-Dtest.classes=" + TEST_CLASS, | ||
"-XX:DumpLoadedClassList=" + CLASSLIST_FILE, | ||
// trigger JVMCI runtime init so that JVMCI classes will be | ||
// included in the classlist | ||
"-XX:+EagerAppCDS", | ||
"-XX:+UseWisp2", | ||
"-cp", | ||
TESTJAR, | ||
TESTNAME); | ||
|
||
OutputAnalyzer output = CDSTestUtils.executeAndLog(pb, "dump-loaded-classes") | ||
.shouldHaveExitValue(0); | ||
|
||
List<String> dumpedClasses = toClassNames(CLASSLIST_FILE); | ||
|
||
for (String clazz : expectedClasses) { | ||
boolean findString = false; | ||
for (String s: dumpedClasses) { | ||
if (s.contains(clazz)) { | ||
findString = true; | ||
break; | ||
} | ||
} | ||
if (findString == false) { | ||
throw new RuntimeException(clazz + " missing in " + | ||
CLASSLIST_FILE); | ||
} | ||
} | ||
boolean findString = false; | ||
for (String s: dumpedClasses) { | ||
if (s.contains("source: file:")) { | ||
findString = true; | ||
break; | ||
} | ||
} | ||
if (findString == false) { | ||
throw new RuntimeException(" there is no class loaded by customer class loader"); | ||
} | ||
} | ||
|
||
static void convertClassList() throws Exception { | ||
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, | ||
"Classes4CDS", | ||
CLASSLIST_FILE, | ||
CLASSLIST_FILE_2); | ||
|
||
OutputAnalyzer output = CDSTestUtils.executeAndLog(pb, "convert-class-list") | ||
.shouldHaveExitValue(0); | ||
|
||
} | ||
static void dumpArchive() throws Exception { | ||
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, | ||
"-cp", | ||
TESTJAR, | ||
"-XX:+EagerAppCDS", | ||
"-XX:SharedClassListFile=" + CLASSLIST_FILE_2, | ||
"-XX:SharedArchiveFile=" + ARCHIVE_FILE, | ||
"-XX:+UseWisp2", | ||
"-Xlog:class+eagerappcds=trace", | ||
"-Xshare:dump", | ||
"-XX:MetaspaceSize=12M", | ||
"-XX:MaxMetaspaceSize=12M"); | ||
|
||
OutputAnalyzer output = CDSTestUtils.executeAndLog(pb, "dump-archive"); | ||
int exitValue = output.getExitValue(); | ||
if (exitValue == 1) { | ||
output.shouldContain("Failed allocating metaspace object type"); | ||
} else if (exitValue == 0) { | ||
output.shouldContain("Loading classes to share"); | ||
} else { | ||
throw new RuntimeException("Unexpected exit value " + exitValue); | ||
} | ||
} | ||
|
||
static void startWithJsa() throws Exception { | ||
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(true, | ||
"-Dtest.classes=" + TEST_CLASS, | ||
"-XX:+EagerAppCDS", | ||
"-Xshare:on", | ||
"-XX:SharedArchiveFile=" + ARCHIVE_FILE, | ||
"-Xlog:class+eagerappcds=trace", | ||
"-XX:+UseWisp2", | ||
"-cp", | ||
TESTJAR, | ||
TESTNAME); | ||
|
||
OutputAnalyzer output = CDSTestUtils.executeAndLog(pb, "start-with-shared-archive") | ||
.shouldHaveExitValue(0); | ||
output.shouldNotContain("[CDS load class Failed"); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
public class TestSimpleWispUsage { | ||
public static void main(String[] args) throws Exception { | ||
Thread io = new Thread(() -> { | ||
try { | ||
int i = 0; | ||
while (i < 3) { | ||
try { | ||
Thread.sleep(1000); | ||
} catch (Exception e) { | ||
} | ||
i++; | ||
} | ||
|
||
} catch (Throwable t) { | ||
} | ||
}, "IO thread"); | ||
|
||
io.start(); | ||
|
||
long start = System.currentTimeMillis(); | ||
Thread.sleep(1000); | ||
} | ||
} |
Oops, something went wrong.