8329112: Clean up CDS checking of unsupported module options
Reviewed-by: ccheung, matsaave
This commit is contained in:
parent
59c2aff1ed
commit
5b05f8e0c4
@ -140,7 +140,7 @@ void CDSConfig::init_shared_archive_paths() {
|
|||||||
if (is_dumping_static_archive()) {
|
if (is_dumping_static_archive()) {
|
||||||
vm_exit_during_initialization("-XX:ArchiveClassesAtExit cannot be used with -Xshare:dump");
|
vm_exit_during_initialization("-XX:ArchiveClassesAtExit cannot be used with -Xshare:dump");
|
||||||
}
|
}
|
||||||
check_unsupported_dumping_properties();
|
check_unsupported_dumping_module_options();
|
||||||
|
|
||||||
if (os::same_files(default_archive_path(), ArchiveClassesAtExit)) {
|
if (os::same_files(default_archive_path(), ArchiveClassesAtExit)) {
|
||||||
vm_exit_during_initialization(
|
vm_exit_during_initialization(
|
||||||
@ -260,41 +260,52 @@ void CDSConfig::check_incompatible_property(const char* key, const char* value)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* unsupported_properties[] = {
|
// Returns any JVM command-line option, such as "--patch-module", that's not supported by CDS.
|
||||||
"jdk.module.limitmods",
|
static const char* find_any_unsupported_module_option() {
|
||||||
"jdk.module.upgrade.path",
|
// Note that arguments.cpp has translated the command-line options into properties. If we find an
|
||||||
"jdk.module.patch.0"
|
// unsupported property, translate it back to its command-line option for better error reporting.
|
||||||
};
|
|
||||||
static const char* unsupported_options[] = {
|
|
||||||
"--limit-modules",
|
|
||||||
"--upgrade-module-path",
|
|
||||||
"--patch-module"
|
|
||||||
};
|
|
||||||
|
|
||||||
void CDSConfig::check_unsupported_dumping_properties() {
|
// The following properties are checked by Arguments::is_internal_module_property() and cannot be
|
||||||
assert(is_dumping_archive(), "this function is only used with CDS dump time");
|
// directly specified in the command-line.
|
||||||
assert(ARRAY_SIZE(unsupported_properties) == ARRAY_SIZE(unsupported_options), "must be");
|
static const char* unsupported_module_properties[] = {
|
||||||
// If a vm option is found in the unsupported_options array, vm will exit with an error message.
|
"jdk.module.limitmods",
|
||||||
|
"jdk.module.upgrade.path",
|
||||||
|
"jdk.module.patch.0"
|
||||||
|
};
|
||||||
|
static const char* unsupported_module_options[] = {
|
||||||
|
"--limit-modules",
|
||||||
|
"--upgrade-module-path",
|
||||||
|
"--patch-module"
|
||||||
|
};
|
||||||
|
|
||||||
|
assert(ARRAY_SIZE(unsupported_module_properties) == ARRAY_SIZE(unsupported_module_options), "must be");
|
||||||
SystemProperty* sp = Arguments::system_properties();
|
SystemProperty* sp = Arguments::system_properties();
|
||||||
while (sp != nullptr) {
|
while (sp != nullptr) {
|
||||||
for (uint i = 0; i < ARRAY_SIZE(unsupported_properties); i++) {
|
for (uint i = 0; i < ARRAY_SIZE(unsupported_module_properties); i++) {
|
||||||
if (strcmp(sp->key(), unsupported_properties[i]) == 0) {
|
if (strcmp(sp->key(), unsupported_module_properties[i]) == 0) {
|
||||||
vm_exit_during_initialization(
|
return unsupported_module_options[i];
|
||||||
"Cannot use the following option when dumping the shared archive", unsupported_options[i]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sp = sp->next();
|
sp = sp->next();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return nullptr; // not found
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDSConfig::check_unsupported_dumping_module_options() {
|
||||||
|
assert(is_dumping_archive(), "this function is only used with CDS dump time");
|
||||||
|
const char* option = find_any_unsupported_module_option();
|
||||||
|
if (option != nullptr) {
|
||||||
|
vm_exit_during_initialization("Cannot use the following option when dumping the shared archive", option);
|
||||||
|
}
|
||||||
// Check for an exploded module build in use with -Xshare:dump.
|
// Check for an exploded module build in use with -Xshare:dump.
|
||||||
if (!Arguments::has_jimage()) {
|
if (!Arguments::has_jimage()) {
|
||||||
vm_exit_during_initialization("Dumping the shared archive is not supported with an exploded module build");
|
vm_exit_during_initialization("Dumping the shared archive is not supported with an exploded module build");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CDSConfig::check_unsupported_cds_runtime_properties() {
|
bool CDSConfig::has_unsupported_runtime_module_options() {
|
||||||
assert(UseSharedSpaces, "this function is only used with -Xshare:{on,auto}");
|
assert(UseSharedSpaces, "this function is only used with -Xshare:{on,auto}");
|
||||||
assert(ARRAY_SIZE(unsupported_properties) == ARRAY_SIZE(unsupported_options), "must be");
|
|
||||||
if (ArchiveClassesAtExit != nullptr) {
|
if (ArchiveClassesAtExit != nullptr) {
|
||||||
// dynamic dumping, just return false for now.
|
// dynamic dumping, just return false for now.
|
||||||
// check_unsupported_dumping_properties() will be called later to check the same set of
|
// check_unsupported_dumping_properties() will be called later to check the same set of
|
||||||
@ -302,20 +313,19 @@ bool CDSConfig::check_unsupported_cds_runtime_properties() {
|
|||||||
// are used.
|
// are used.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
for (uint i = 0; i < ARRAY_SIZE(unsupported_properties); i++) {
|
const char* option = find_any_unsupported_module_option();
|
||||||
if (Arguments::get_property(unsupported_properties[i]) != nullptr) {
|
if (option != nullptr) {
|
||||||
if (RequireSharedSpaces) {
|
if (RequireSharedSpaces) {
|
||||||
warning("CDS is disabled when the %s option is specified.", unsupported_options[i]);
|
warning("CDS is disabled when the %s option is specified.", option);
|
||||||
} else {
|
} else {
|
||||||
log_info(cds)("CDS is disabled when the %s option is specified.", unsupported_options[i]);
|
log_info(cds)("CDS is disabled when the %s option is specified.", option);
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CDSConfig::check_vm_args_consistency(bool patch_mod_javabase, bool mode_flag_cmd_line) {
|
bool CDSConfig::check_vm_args_consistency(bool patch_mod_javabase, bool mode_flag_cmd_line) {
|
||||||
if (is_dumping_static_archive()) {
|
if (is_dumping_static_archive()) {
|
||||||
if (!mode_flag_cmd_line) {
|
if (!mode_flag_cmd_line) {
|
||||||
// By default, -Xshare:dump runs in interpreter-only mode, which is required for deterministic archive.
|
// By default, -Xshare:dump runs in interpreter-only mode, which is required for deterministic archive.
|
||||||
@ -363,7 +373,7 @@ bool CDSConfig::check_vm_args_consistency(bool patch_mod_javabase, bool mode_fl
|
|||||||
if (UseSharedSpaces && patch_mod_javabase) {
|
if (UseSharedSpaces && patch_mod_javabase) {
|
||||||
Arguments::no_shared_spaces("CDS is disabled when " JAVA_BASE_NAME " module is patched.");
|
Arguments::no_shared_spaces("CDS is disabled when " JAVA_BASE_NAME " module is patched.");
|
||||||
}
|
}
|
||||||
if (UseSharedSpaces && check_unsupported_cds_runtime_properties()) {
|
if (UseSharedSpaces && has_unsupported_runtime_module_options()) {
|
||||||
UseSharedSpaces = false;
|
UseSharedSpaces = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,7 +46,6 @@ class CDSConfig : public AllStatic {
|
|||||||
char** base_archive_path,
|
char** base_archive_path,
|
||||||
char** top_archive_path);
|
char** top_archive_path);
|
||||||
static void init_shared_archive_paths();
|
static void init_shared_archive_paths();
|
||||||
static bool check_unsupported_cds_runtime_properties();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Used by jdk.internal.misc.CDS.getCDSConfigStatus();
|
// Used by jdk.internal.misc.CDS.getCDSConfigStatus();
|
||||||
@ -60,8 +59,9 @@ public:
|
|||||||
static void initialize() NOT_CDS_RETURN;
|
static void initialize() NOT_CDS_RETURN;
|
||||||
static void check_internal_module_property(const char* key, const char* value) NOT_CDS_RETURN;
|
static void check_internal_module_property(const char* key, const char* value) NOT_CDS_RETURN;
|
||||||
static void check_incompatible_property(const char* key, const char* value) NOT_CDS_RETURN;
|
static void check_incompatible_property(const char* key, const char* value) NOT_CDS_RETURN;
|
||||||
static void check_unsupported_dumping_properties() NOT_CDS_RETURN;
|
static void check_unsupported_dumping_module_options() NOT_CDS_RETURN;
|
||||||
static bool check_vm_args_consistency(bool patch_mod_javabase, bool mode_flag_cmd_line) NOT_CDS_RETURN_(true);
|
static bool has_unsupported_runtime_module_options() NOT_CDS_RETURN_(false);
|
||||||
|
static bool check_vm_args_consistency(bool patch_mod_javabase, bool mode_flag_cmd_line) NOT_CDS_RETURN_(true);
|
||||||
|
|
||||||
// --- Basic CDS features
|
// --- Basic CDS features
|
||||||
|
|
||||||
|
@ -651,7 +651,7 @@ void MetaspaceShared::link_shared_classes(bool jcmd_request, TRAPS) {
|
|||||||
|
|
||||||
void MetaspaceShared::prepare_for_dumping() {
|
void MetaspaceShared::prepare_for_dumping() {
|
||||||
assert(CDSConfig::is_dumping_archive(), "sanity");
|
assert(CDSConfig::is_dumping_archive(), "sanity");
|
||||||
CDSConfig::check_unsupported_dumping_properties();
|
CDSConfig::check_unsupported_dumping_module_options();
|
||||||
ClassLoader::initialize_shared_path(JavaThread::current());
|
ClassLoader::initialize_shared_path(JavaThread::current());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1119,18 +1119,8 @@ InstanceKlass* ClassLoader::load_class(Symbol* name, PackageEntry* pkg_entry, bo
|
|||||||
// Note: The --patch-module entries are never searched if the boot loader's
|
// Note: The --patch-module entries are never searched if the boot loader's
|
||||||
// visibility boundary is limited to only searching the append entries.
|
// visibility boundary is limited to only searching the append entries.
|
||||||
if (_patch_mod_entries != nullptr && !search_append_only) {
|
if (_patch_mod_entries != nullptr && !search_append_only) {
|
||||||
// At CDS dump time, the --patch-module entries are ignored. That means a
|
assert(!CDSConfig::is_dumping_archive(), "CDS doesn't support --patch-module during dumping");
|
||||||
// class is still loaded from the runtime image even if it might
|
stream = search_module_entries(THREAD, _patch_mod_entries, pkg_entry, file_name);
|
||||||
// appear in the _patch_mod_entries. The runtime shared class visibility
|
|
||||||
// check will determine if a shared class is visible based on the runtime
|
|
||||||
// environment, including the runtime --patch-module setting.
|
|
||||||
//
|
|
||||||
// Dynamic dumping requires UseSharedSpaces to be enabled. Since --patch-module
|
|
||||||
// is not supported with UseSharedSpaces, we can never come here during dynamic dumping.
|
|
||||||
assert(!CDSConfig::is_dumping_dynamic_archive(), "sanity");
|
|
||||||
if (!CDSConfig::is_dumping_static_archive()) {
|
|
||||||
stream = search_module_entries(THREAD, _patch_mod_entries, pkg_entry, file_name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load Attempt #2: [jimage | exploded build]
|
// Load Attempt #2: [jimage | exploded build]
|
||||||
@ -1141,6 +1131,7 @@ InstanceKlass* ClassLoader::load_class(Symbol* name, PackageEntry* pkg_entry, bo
|
|||||||
} else {
|
} else {
|
||||||
// Exploded build - attempt to locate class in its defining module's location.
|
// Exploded build - attempt to locate class in its defining module's location.
|
||||||
assert(_exploded_entries != nullptr, "No exploded build entries present");
|
assert(_exploded_entries != nullptr, "No exploded build entries present");
|
||||||
|
assert(!CDSConfig::is_dumping_archive(), "CDS dumping doesn't support exploded build");
|
||||||
stream = search_module_entries(THREAD, _exploded_entries, pkg_entry, file_name);
|
stream = search_module_entries(THREAD, _exploded_entries, pkg_entry, file_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user