8244778: Archive full module graph in CDS

Reviewed-by: erikj, coleenp, lfoltan, redestad, alanb, mchung
This commit is contained in:
Ioi Lam 2020-09-13 14:45:12 +00:00
parent 998ce78e53
commit 03a4df0acd
59 changed files with 2052 additions and 164 deletions

View file

@ -55,6 +55,7 @@ import java.util.stream.Stream;
import jdk.internal.loader.BuiltinClassLoader;
import jdk.internal.loader.BootLoader;
import jdk.internal.loader.ClassLoaders;
import jdk.internal.misc.VM;
import jdk.internal.module.IllegalAccessLogger;
import jdk.internal.module.ModuleLoaderMap;
import jdk.internal.module.ServicesCatalog;
@ -246,12 +247,55 @@ public final class Module implements AnnotatedElement {
// --
// special Module to mean "all unnamed modules"
private static final Module ALL_UNNAMED_MODULE = new Module(null);
private static final Set<Module> ALL_UNNAMED_MODULE_SET = Set.of(ALL_UNNAMED_MODULE);
private static final Module ALL_UNNAMED_MODULE;
private static final Set<Module> ALL_UNNAMED_MODULE_SET;
// special Module to mean "everyone"
private static final Module EVERYONE_MODULE = new Module(null);
private static final Set<Module> EVERYONE_SET = Set.of(EVERYONE_MODULE);
private static final Module EVERYONE_MODULE;
private static final Set<Module> EVERYONE_SET;
private static class ArchivedData {
private static ArchivedData archivedData;
private final Module allUnnamedModule;
private final Set<Module> allUnnamedModules;
private final Module everyoneModule;
private final Set<Module> everyoneSet;
private ArchivedData() {
this.allUnnamedModule = ALL_UNNAMED_MODULE;
this.allUnnamedModules = ALL_UNNAMED_MODULE_SET;
this.everyoneModule = EVERYONE_MODULE;
this.everyoneSet = EVERYONE_SET;
}
static void archive() {
archivedData = new ArchivedData();
}
static ArchivedData get() {
return archivedData;
}
static {
VM.initializeFromArchive(ArchivedData.class);
}
}
static {
ArchivedData archivedData = ArchivedData.get();
if (archivedData != null) {
ALL_UNNAMED_MODULE = archivedData.allUnnamedModule;
ALL_UNNAMED_MODULE_SET = archivedData.allUnnamedModules;
EVERYONE_MODULE = archivedData.everyoneModule;
EVERYONE_SET = archivedData.everyoneSet;
} else {
ALL_UNNAMED_MODULE = new Module(null);
ALL_UNNAMED_MODULE_SET = Set.of(ALL_UNNAMED_MODULE);
EVERYONE_MODULE = new Module(null);
EVERYONE_SET = Set.of(EVERYONE_MODULE);
ArchivedData.archive();
}
}
/**
* The holder of data structures to support readability, exports, and