diff options
author | iklam <ilam3388@gmail.com> | 2024-03-01 17:08:46 -0800 |
---|---|---|
committer | iklam <ilam3388@gmail.com> | 2024-03-01 17:08:46 -0800 |
commit | 78e828de526da5d497eec3ddde4df3acb211f4a4 (patch) | |
tree | 892276a9bd052dd46a19500bc70ba9b76a876ef9 | |
parent | 8f6edd8dc866bf970b7e7b8358f62832887e6e8b (diff) |
8327138: Clean up status management in cdsConfig.hpp and CDS.javapr/18095
19 files changed, 138 insertions, 148 deletions
diff --git a/src/hotspot/share/cds/archiveHeapLoader.cpp b/src/hotspot/share/cds/archiveHeapLoader.cpp index b5af9fec573..535ca9d37a7 100644 --- a/src/hotspot/share/cds/archiveHeapLoader.cpp +++ b/src/hotspot/share/cds/archiveHeapLoader.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, 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 @@ -88,7 +88,7 @@ void ArchiveHeapLoader::fixup_region() { fill_failed_loaded_heap(); } if (is_in_use()) { - if (!CDSConfig::is_loading_full_module_graph()) { + if (!CDSConfig::is_using_full_module_graph()) { // Need to remove all the archived java.lang.Module objects from HeapShared::roots(). ClassLoaderDataShared::clear_archived_oops(); } diff --git a/src/hotspot/share/cds/cdsConfig.cpp b/src/hotspot/share/cds/cdsConfig.cpp index 818b92efe70..23a8f55c276 100644 --- a/src/hotspot/share/cds/cdsConfig.cpp +++ b/src/hotspot/share/cds/cdsConfig.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, 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 @@ -25,28 +25,36 @@ #include "precompiled.hpp" #include "cds/archiveHeapLoader.hpp" #include "cds/cdsConfig.hpp" +#include "cds/classListWriter.hpp" #include "cds/heapShared.hpp" #include "classfile/classLoaderDataShared.hpp" #include "classfile/moduleEntry.hpp" #include "include/jvm_io.h" #include "logging/log.hpp" +#include "memory/universe.hpp" #include "runtime/arguments.hpp" #include "runtime/java.hpp" #include "utilities/defaultStream.hpp" bool CDSConfig::_is_dumping_static_archive = false; bool CDSConfig::_is_dumping_dynamic_archive = false; - -// The ability to dump the FMG depends on many factors checked by -// is_dumping_full_module_graph(), but can be unconditionally disabled by -// _dumping_full_module_graph_disabled. (Ditto for loading the FMG). -bool CDSConfig::_dumping_full_module_graph_disabled = false; -bool CDSConfig::_loading_full_module_graph_disabled = false; +bool CDSConfig::_is_using_optimized_module_handling = true; +bool CDSConfig::_is_dumping_full_module_graph = true; +bool CDSConfig::_is_using_full_module_graph = true; char* CDSConfig::_default_archive_path = nullptr; char* CDSConfig::_static_archive_path = nullptr; char* CDSConfig::_dynamic_archive_path = nullptr; +int CDSConfig::get_status() { + assert(Universe::is_fully_initialized(), "status is finalized only after Universe is initialized"); + return (is_dumping_archive() ? IS_DUMPING_ARCHIVE : 0) | + (is_dumping_static_archive() ? IS_DUMPING_STATIC_ARCHIVE : 0) | + (is_logging_lambda_form_invokers() ? IS_LOGGING_LAMBDA_FORM_INVOKERS : 0) | + (is_using_archive() ? IS_USING_ARCHIVE : 0); +} + + void CDSConfig::initialize() { if (is_dumping_static_archive()) { if (RequireSharedSpaces) { @@ -62,6 +70,10 @@ void CDSConfig::initialize() { if (is_dumping_static_archive() || UseSharedSpaces) { init_shared_archive_paths(); } + + if (!is_dumping_heap()) { + _is_dumping_full_module_graph = false; + } } char* CDSConfig::default_archive_path() { @@ -225,14 +237,14 @@ void CDSConfig::init_shared_archive_paths() { void CDSConfig::check_system_property(const char* key, const char* value) { if (Arguments::is_internal_module_property(key)) { - MetaspaceShared::disable_optimized_module_handling(); + stop_using_optimized_module_handling(); log_info(cds)("optimized module handling: disabled due to incompatible property: %s=%s", key, value); } if (strcmp(key, "jdk.module.showModuleResolution") == 0 || strcmp(key, "jdk.module.validation") == 0 || strcmp(key, "java.system.class.loader") == 0) { - disable_loading_full_module_graph(); - disable_dumping_full_module_graph(); + stop_dumping_full_module_graph(); + stop_using_full_module_graph(); log_info(cds)("full module graph: disabled due to incompatible property: %s=%s", key, value); } } @@ -355,53 +367,59 @@ bool CDSConfig::check_vm_args_consistency(bool patch_mod_javabase, bool mode_fl return true; } +bool CDSConfig::is_using_archive() { + return UseSharedSpaces; // TODO: UseSharedSpaces will be eventually replaced by CDSConfig::is_using_archive() +} + +bool CDSConfig::is_logging_lambda_form_invokers() { + return ClassListWriter::is_enabled() || is_dumping_dynamic_archive(); +} + +void CDSConfig::stop_using_optimized_module_handling() { + _is_using_optimized_module_handling = false; + _is_dumping_full_module_graph = false; // This requires is_using_optimized_module_handling() + _is_using_full_module_graph = false; // This requires is_using_optimized_module_handling() +} + #if INCLUDE_CDS_JAVA_HEAP bool CDSConfig::is_dumping_heap() { // heap dump is not supported in dynamic dump return is_dumping_static_archive() && HeapShared::can_write(); } -bool CDSConfig::is_dumping_full_module_graph() { - if (!_dumping_full_module_graph_disabled && - is_dumping_heap() && - MetaspaceShared::use_optimized_module_handling()) { +bool CDSConfig::is_using_full_module_graph() { + if (ClassLoaderDataShared::is_full_module_graph_loaded()) { return true; - } else { - return false; } -} -bool CDSConfig::is_loading_full_module_graph() { - if (ClassLoaderDataShared::is_full_module_graph_loaded()) { - return true; + if (!_is_using_full_module_graph) { + return false; } - if (!_loading_full_module_graph_disabled && - UseSharedSpaces && - ArchiveHeapLoader::can_use() && - MetaspaceShared::use_optimized_module_handling()) { + if (UseSharedSpaces && ArchiveHeapLoader::can_use()) { // Classes used by the archived full module graph are loaded in JVMTI early phase. assert(!(JvmtiExport::should_post_class_file_load_hook() && JvmtiExport::has_early_class_hook_env()), "CDS should be disabled if early class hooks are enabled"); return true; } else { + _is_using_full_module_graph = false; return false; } } -void CDSConfig::disable_dumping_full_module_graph(const char* reason) { - if (!_dumping_full_module_graph_disabled) { - _dumping_full_module_graph_disabled = true; +void CDSConfig::stop_dumping_full_module_graph(const char* reason) { + if (_is_dumping_full_module_graph) { + _is_dumping_full_module_graph = false; if (reason != nullptr) { log_info(cds)("full module graph cannot be dumped: %s", reason); } } } -void CDSConfig::disable_loading_full_module_graph(const char* reason) { +void CDSConfig::stop_using_full_module_graph(const char* reason) { assert(!ClassLoaderDataShared::is_full_module_graph_loaded(), "you call this function too late!"); - if (!_loading_full_module_graph_disabled) { - _loading_full_module_graph_disabled = true; + if (_is_using_full_module_graph) { + _is_using_full_module_graph = false; if (reason != nullptr) { log_info(cds)("full module graph cannot be loaded: %s", reason); } diff --git a/src/hotspot/share/cds/cdsConfig.hpp b/src/hotspot/share/cds/cdsConfig.hpp index ec5352b3703..ef3a525fa89 100644 --- a/src/hotspot/share/cds/cdsConfig.hpp +++ b/src/hotspot/share/cds/cdsConfig.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2023, 2024, 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 @@ -33,8 +33,9 @@ class CDSConfig : public AllStatic { #if INCLUDE_CDS static bool _is_dumping_static_archive; static bool _is_dumping_dynamic_archive; - static bool _dumping_full_module_graph_disabled; - static bool _loading_full_module_graph_disabled; + static bool _is_using_optimized_module_handling; + static bool _is_dumping_full_module_graph; + static bool _is_using_full_module_graph; static char* _default_archive_path; static char* _static_archive_path; @@ -48,6 +49,13 @@ class CDSConfig : public AllStatic { static bool check_unsupported_cds_runtime_properties(); public: + // Used by jdk.internal.misc.CDS.getCDSConfigStatus(); + static const int IS_DUMPING_ARCHIVE = 1 << 0; + static const int IS_DUMPING_STATIC_ARCHIVE = 1 << 1; + static const int IS_LOGGING_LAMBDA_FORM_INVOKERS = 1 << 2; + static const int IS_USING_ARCHIVE = 1 << 3; + static int get_status() NOT_CDS_RETURN_(0); + // Initialization and command-line checking static void initialize() NOT_CDS_RETURN; static void check_system_property(const char* key, const char* value) NOT_CDS_RETURN; @@ -61,6 +69,7 @@ public: static bool is_dumping_dynamic_archive() { return CDS_ONLY(_is_dumping_dynamic_archive) NOT_CDS(false); } static void enable_dumping_dynamic_archive() { CDS_ONLY(_is_dumping_dynamic_archive = true); } static void disable_dumping_dynamic_archive() { CDS_ONLY(_is_dumping_dynamic_archive = false); } + static bool is_using_archive() NOT_CDS_RETURN_(false); // Archive paths // Points to the classes.jsa in $JAVA_HOME @@ -71,15 +80,18 @@ public: static const char* dynamic_archive_path() { return CDS_ONLY(_dynamic_archive_path) NOT_CDS(nullptr); } static int num_archives(const char* archive_path) NOT_CDS_RETURN_(0); + static bool is_logging_lambda_form_invokers() NOT_CDS_RETURN_(false); + // Can we skip some expensive operations related to modules? + static bool is_using_optimized_module_handling() { return CDS_ONLY(_is_using_optimized_module_handling) NOT_CDS(false); } + static void stop_using_optimized_module_handling() NOT_CDS_RETURN; // CDS archived heap - static bool is_dumping_heap() NOT_CDS_JAVA_HEAP_RETURN_(false); - static void disable_dumping_full_module_graph(const char* reason = nullptr) NOT_CDS_JAVA_HEAP_RETURN; - static bool is_dumping_full_module_graph() NOT_CDS_JAVA_HEAP_RETURN_(false); - static void disable_loading_full_module_graph(const char* reason = nullptr) NOT_CDS_JAVA_HEAP_RETURN; - static bool is_loading_full_module_graph() NOT_CDS_JAVA_HEAP_RETURN_(false); - + static bool is_dumping_heap() NOT_CDS_JAVA_HEAP_RETURN_(false); + static void stop_dumping_full_module_graph(const char* reason = nullptr) NOT_CDS_JAVA_HEAP_RETURN; + static bool is_dumping_full_module_graph() { return CDS_ONLY(_is_dumping_full_module_graph) NOT_CDS(false); } + static void stop_using_full_module_graph(const char* reason = nullptr) NOT_CDS_JAVA_HEAP_RETURN; + static bool is_using_full_module_graph() NOT_CDS_JAVA_HEAP_RETURN_(false); }; #endif // SHARE_CDS_CDSCONFIG_HPP diff --git a/src/hotspot/share/cds/cdsProtectionDomain.cpp b/src/hotspot/share/cds/cdsProtectionDomain.cpp index 70ce4fb3b96..a4ffeea26dc 100644 --- a/src/hotspot/share/cds/cdsProtectionDomain.cpp +++ b/src/hotspot/share/cds/cdsProtectionDomain.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2024, 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 @@ -119,7 +119,7 @@ Handle CDSProtectionDomain::get_package_name(Symbol* class_name, TRAPS) { PackageEntry* CDSProtectionDomain::get_package_entry_from_class(InstanceKlass* ik, Handle class_loader) { PackageEntry* pkg_entry = ik->package(); - if (CDSConfig::is_loading_full_module_graph() && ik->is_shared() && pkg_entry != nullptr) { + if (CDSConfig::is_using_full_module_graph() && ik->is_shared() && pkg_entry != nullptr) { assert(MetaspaceShared::is_in_shared_metaspace(pkg_entry), "must be"); assert(!ik->is_shared_unregistered_class(), "unexpected archived package entry for an unregistered class"); assert(ik->module()->is_named(), "unexpected archived package entry for a class in an unnamed module"); diff --git a/src/hotspot/share/cds/filemap.cpp b/src/hotspot/share/cds/filemap.cpp index 4c3b9fe018e..7b9dbd80a68 100644 --- a/src/hotspot/share/cds/filemap.cpp +++ b/src/hotspot/share/cds/filemap.cpp @@ -212,7 +212,7 @@ void FileMapHeader::populate(FileMapInfo *info, size_t core_region_alignment, _compressed_oops = UseCompressedOops; _compressed_class_ptrs = UseCompressedClassPointers; _max_heap_size = MaxHeapSize; - _use_optimized_module_handling = MetaspaceShared::use_optimized_module_handling(); + _use_optimized_module_handling = CDSConfig::is_using_optimized_module_handling(); _has_full_module_graph = CDSConfig::is_dumping_full_module_graph(); // The following fields are for sanity checks for whether this archive @@ -1977,7 +1977,7 @@ void FileMapInfo::map_or_load_heap_region() { } if (!success) { - CDSConfig::disable_loading_full_module_graph(); + CDSConfig::stop_using_full_module_graph(); } } @@ -2393,13 +2393,13 @@ bool FileMapHeader::validate() { } if (!_use_optimized_module_handling) { - MetaspaceShared::disable_optimized_module_handling(); + CDSConfig::stop_using_optimized_module_handling(); log_info(cds)("optimized module handling: disabled because archive was created without optimized module handling"); } if (is_static() && !_has_full_module_graph) { // Only the static archive can contain the full module graph. - CDSConfig::disable_loading_full_module_graph("archive was created without full module graph"); + CDSConfig::stop_using_full_module_graph("archive was created without full module graph"); } return true; diff --git a/src/hotspot/share/cds/heapShared.cpp b/src/hotspot/share/cds/heapShared.cpp index 0225977e874..5160228b27c 100644 --- a/src/hotspot/share/cds/heapShared.cpp +++ b/src/hotspot/share/cds/heapShared.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2024, 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 @@ -972,7 +972,7 @@ HeapShared::resolve_or_init_classes_for_subgraph_of(Klass* k, bool do_init, TRAP } return nullptr; } else { - if (record->is_full_module_graph() && !CDSConfig::is_loading_full_module_graph()) { + if (record->is_full_module_graph() && !CDSConfig::is_using_full_module_graph()) { if (log_is_enabled(Info, cds, heap)) { ResourceMark rm(THREAD); log_info(cds, heap)("subgraph %s cannot be used because full module graph is disabled", diff --git a/src/hotspot/share/cds/metaspaceShared.cpp b/src/hotspot/share/cds/metaspaceShared.cpp index ae5d92fedff..ca745671e40 100644 --- a/src/hotspot/share/cds/metaspaceShared.cpp +++ b/src/hotspot/share/cds/metaspaceShared.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, 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 @@ -96,7 +96,6 @@ bool MetaspaceShared::_remapped_readwrite = false; void* MetaspaceShared::_shared_metaspace_static_top = nullptr; intx MetaspaceShared::_relocation_delta; char* MetaspaceShared::_requested_base_address; -bool MetaspaceShared::_use_optimized_module_handling = true; // The CDS archive is divided into the following regions: // rw - read-write metadata @@ -784,7 +783,7 @@ void MetaspaceShared::preload_and_dump_impl(TRAPS) { if (CDSConfig::is_dumping_heap()) { if (!HeapShared::is_archived_boot_layer_available(THREAD)) { log_info(cds)("archivedBootLayer not available, disabling full module graph"); - CDSConfig::disable_dumping_full_module_graph(); + CDSConfig::stop_dumping_full_module_graph(); } HeapShared::init_for_dumping(CHECK); ArchiveHeapWriter::init(); @@ -1176,8 +1175,8 @@ MapArchiveResult MetaspaceShared::map_archives(FileMapInfo* static_mapinfo, File static_mapinfo->map_or_load_heap_region(); } #endif // _LP64 - log_info(cds)("initial optimized module handling: %s", MetaspaceShared::use_optimized_module_handling() ? "enabled" : "disabled"); - log_info(cds)("initial full module graph: %s", CDSConfig::is_loading_full_module_graph() ? "enabled" : "disabled"); + log_info(cds)("initial optimized module handling: %s", CDSConfig::is_using_optimized_module_handling() ? "enabled" : "disabled"); + log_info(cds)("initial full module graph: %s", CDSConfig::is_using_full_module_graph() ? "enabled" : "disabled"); } else { unmap_archive(static_mapinfo); unmap_archive(dynamic_mapinfo); diff --git a/src/hotspot/share/cds/metaspaceShared.hpp b/src/hotspot/share/cds/metaspaceShared.hpp index 737340788f1..89188a12dce 100644 --- a/src/hotspot/share/cds/metaspaceShared.hpp +++ b/src/hotspot/share/cds/metaspaceShared.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, 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 @@ -52,7 +52,6 @@ class MetaspaceShared : AllStatic { static void* _shared_metaspace_static_top; static intx _relocation_delta; static char* _requested_base_address; - static bool _use_optimized_module_handling; public: enum { // core archive spaces @@ -159,10 +158,6 @@ public: return is_windows; } - // Can we skip some expensive operations related to modules? - static bool use_optimized_module_handling() { return NOT_CDS(false) CDS_ONLY(_use_optimized_module_handling); } - static void disable_optimized_module_handling() { _use_optimized_module_handling = false; } - private: static void read_extra_data(JavaThread* current, const char* filename) NOT_CDS_RETURN; static FileMapInfo* open_static_archive(); diff --git a/src/hotspot/share/classfile/classLoaderDataShared.cpp b/src/hotspot/share/classfile/classLoaderDataShared.cpp index e6f34b2b8b9..b6d93eace4e 100644 --- a/src/hotspot/share/classfile/classLoaderDataShared.cpp +++ b/src/hotspot/share/classfile/classLoaderDataShared.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, 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 @@ -172,7 +172,7 @@ void ClassLoaderDataShared::serialize(SerializeClosure* f) { _archived_system_loader_data.serialize(f); f->do_ptr(&_archived_javabase_moduleEntry); - if (f->reading() && CDSConfig::is_loading_full_module_graph()) { + if (f->reading() && CDSConfig::is_using_full_module_graph()) { // Must be done before ClassLoader::create_javabase() _archived_boot_loader_data.restore(null_class_loader_data(), true, false); ModuleEntryTable::set_javabase_moduleEntry(_archived_javabase_moduleEntry); @@ -182,25 +182,25 @@ void ClassLoaderDataShared::serialize(SerializeClosure* f) { } void ClassLoaderDataShared::clear_archived_oops() { - assert(!CDSConfig::is_loading_full_module_graph(), "must be"); + assert(!CDSConfig::is_using_full_module_graph(), "must be"); _archived_boot_loader_data.clear_archived_oops(); _archived_platform_loader_data.clear_archived_oops(); _archived_system_loader_data.clear_archived_oops(); } oop ClassLoaderDataShared::restore_archived_oops_for_null_class_loader_data() { - assert(CDSConfig::is_loading_full_module_graph(), "must be"); + assert(CDSConfig::is_using_full_module_graph(), "must be"); _archived_boot_loader_data.restore(null_class_loader_data(), false, true); return _archived_javabase_moduleEntry->module(); } void ClassLoaderDataShared::restore_java_platform_loader_from_archive(ClassLoaderData* loader_data) { - assert(CDSConfig::is_loading_full_module_graph(), "must be"); + assert(CDSConfig::is_using_full_module_graph(), "must be"); _archived_platform_loader_data.restore(loader_data, true, true); } void ClassLoaderDataShared::restore_java_system_loader_from_archive(ClassLoaderData* loader_data) { - assert(CDSConfig::is_loading_full_module_graph(), "must be"); + assert(CDSConfig::is_using_full_module_graph(), "must be"); _archived_system_loader_data.restore(loader_data, true, true); _full_module_graph_loaded = true; } diff --git a/src/hotspot/share/classfile/modules.cpp b/src/hotspot/share/classfile/modules.cpp index 4664d9565d3..d4f3cc29962 100644 --- a/src/hotspot/share/classfile/modules.cpp +++ b/src/hotspot/share/classfile/modules.cpp @@ -596,15 +596,15 @@ void Modules::serialize(SerializeClosure* soc) { if (disable) { log_info(cds)("Disabling optimized module handling"); - MetaspaceShared::disable_optimized_module_handling(); + CDSConfig::stop_using_optimized_module_handling(); } - log_info(cds)("optimized module handling: %s", MetaspaceShared::use_optimized_module_handling() ? "enabled" : "disabled"); - log_info(cds)("full module graph: %s", CDSConfig::is_loading_full_module_graph() ? "enabled" : "disabled"); + log_info(cds)("optimized module handling: %s", CDSConfig::is_using_optimized_module_handling() ? "enabled" : "disabled"); + log_info(cds)("full module graph: %s", CDSConfig::is_using_full_module_graph() ? "enabled" : "disabled"); } } void Modules::define_archived_modules(Handle h_platform_loader, Handle h_system_loader, TRAPS) { - assert(CDSConfig::is_loading_full_module_graph(), "must be"); + assert(CDSConfig::is_using_full_module_graph(), "must be"); // We don't want the classes used by the archived full module graph to be redefined by JVMTI. // Luckily, such classes are loaded in the JVMTI "early" phase, and CDS is disabled if a JVMTI diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp index 30538926b41..062e53ae114 100644 --- a/src/hotspot/share/classfile/systemDictionary.cpp +++ b/src/hotspot/share/classfile/systemDictionary.cpp @@ -140,7 +140,7 @@ void SystemDictionary::compute_java_loaders(TRAPS) { } else { // It must have been restored from the archived module graph assert(UseSharedSpaces, "must be"); - assert(CDSConfig::is_loading_full_module_graph(), "must be"); + assert(CDSConfig::is_using_full_module_graph(), "must be"); DEBUG_ONLY( oop system_loader = get_system_class_loader_impl(CHECK); assert(_java_system_loader.resolve() == system_loader, "must be"); @@ -153,7 +153,7 @@ void SystemDictionary::compute_java_loaders(TRAPS) { } else { // It must have been restored from the archived module graph assert(UseSharedSpaces, "must be"); - assert(CDSConfig::is_loading_full_module_graph(), "must be"); + assert(CDSConfig::is_using_full_module_graph(), "must be"); DEBUG_ONLY( oop platform_loader = get_platform_class_loader_impl(CHECK); assert(_java_platform_loader.resolve() == platform_loader, "must be"); @@ -965,7 +965,7 @@ bool SystemDictionary::is_shared_class_visible(Symbol* class_name, // (2) Check if we are loading into the same module from the same location as in dump time. - if (MetaspaceShared::use_optimized_module_handling()) { + if (CDSConfig::is_using_optimized_module_handling()) { // Class visibility has not changed between dump time and run time, so a class // that was visible (and thus archived) during dump time is always visible during runtime. assert(SystemDictionary::is_shared_class_visible_impl(class_name, ik, pkg_entry, class_loader), diff --git a/src/hotspot/share/include/jvm.h b/src/hotspot/share/include/jvm.h index b49c15d73b6..99cdac3aec5 100644 --- a/src/hotspot/share/include/jvm.h +++ b/src/hotspot/share/include/jvm.h @@ -197,14 +197,8 @@ JVM_LookupLambdaProxyClassFromArchive(JNIEnv* env, jclass caller, jobject implementationMember, jobject dynamicMethodType); -JNIEXPORT jboolean JNICALL -JVM_IsCDSDumpingEnabled(JNIEnv* env); - -JNIEXPORT jboolean JNICALL -JVM_IsSharingEnabled(JNIEnv* env); - -JNIEXPORT jboolean JNICALL -JVM_IsDumpingClassList(JNIEnv* env); +JNIEXPORT jint JNICALL +JVM_GetCDSConfigStatus(); JNIEXPORT jlong JNICALL JVM_GetRandomSeedForDumping(); diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp index e236e583d24..53f3bfdd129 100644 --- a/src/hotspot/share/oops/instanceKlass.cpp +++ b/src/hotspot/share/oops/instanceKlass.cpp @@ -2705,7 +2705,7 @@ void InstanceKlass::init_shared_package_entry() { _package_entry = PackageEntry::get_archived_entry(_package_entry); } } else if (CDSConfig::is_dumping_dynamic_archive() && - CDSConfig::is_loading_full_module_graph() && + CDSConfig::is_using_full_module_graph() && MetaspaceShared::is_in_shared_metaspace(_package_entry)) { // _package_entry is an archived package in the base archive. Leave it as is. } else { @@ -3031,7 +3031,7 @@ void InstanceKlass::set_package(ClassLoaderData* loader_data, PackageEntry* pkg_ } if (is_shared() && _package_entry != nullptr) { - if (CDSConfig::is_loading_full_module_graph() && _package_entry == pkg_entry) { + if (CDSConfig::is_using_full_module_graph() && _package_entry == pkg_entry) { // we can use the saved package assert(MetaspaceShared::is_in_shared_metaspace(_package_entry), "must be"); return; diff --git a/src/hotspot/share/prims/jvm.cpp b/src/hotspot/share/prims/jvm.cpp index 4ec0dfa34cc..500036febab 100644 --- a/src/hotspot/share/prims/jvm.cpp +++ b/src/hotspot/share/prims/jvm.cpp @@ -3688,14 +3688,6 @@ JVM_ENTRY(jclass, JVM_LookupLambdaProxyClassFromArchive(JNIEnv* env, #endif // INCLUDE_CDS JVM_END -JVM_LEAF(jboolean, JVM_IsCDSDumpingEnabled(JNIEnv* env)) - return CDSConfig::is_dumping_archive(); -JVM_END - -JVM_LEAF(jboolean, JVM_IsSharingEnabled(JNIEnv* env)) - return UseSharedSpaces; -JVM_END - JVM_ENTRY_NO_ENV(jlong, JVM_GetRandomSeedForDumping()) if (CDSConfig::is_dumping_static_archive()) { // We do this so that the default CDS archive can be deterministic. @@ -3719,17 +3711,13 @@ JVM_ENTRY_NO_ENV(jlong, JVM_GetRandomSeedForDumping()) } JVM_END -JVM_LEAF(jboolean, JVM_IsDumpingClassList(JNIEnv *env)) -#if INCLUDE_CDS - return ClassListWriter::is_enabled() || CDSConfig::is_dumping_dynamic_archive(); -#else - return false; -#endif // INCLUDE_CDS +JVM_ENTRY_NO_ENV(jint, JVM_GetCDSConfigStatus()) + return CDSConfig::get_status(); JVM_END JVM_ENTRY(void, JVM_LogLambdaFormInvoker(JNIEnv *env, jstring line)) #if INCLUDE_CDS - assert(ClassListWriter::is_enabled() || CDSConfig::is_dumping_dynamic_archive(), "Should be set and open or do dynamic dump"); + assert(CDSConfig::is_logging_lambda_form_invokers(), "sanity"); if (line != nullptr) { ResourceMark rm(THREAD); Handle h_line (THREAD, JNIHandles::resolve_non_null(line)); diff --git a/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java b/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java index 593c66fab70..83b2b21562e 100644 --- a/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java +++ b/src/java.base/share/classes/java/lang/invoke/InnerClassLambdaMetafactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2024, 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 @@ -255,7 +255,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*; private Class<?> spinInnerClass() throws LambdaConversionException { // CDS does not handle disableEagerInitialization or useImplMethodHandle if (!disableEagerInitialization && !useImplMethodHandle) { - if (CDS.isSharingEnabled()) { + if (CDS.isUsingArchive()) { // load from CDS archive if present Class<?> innerClass = LambdaProxyClassArchive.find(targetClass, interfaceMethodName, diff --git a/src/java.base/share/classes/java/lang/invoke/LambdaProxyClassArchive.java b/src/java.base/share/classes/java/lang/invoke/LambdaProxyClassArchive.java index ef79f4d473c..4d14848043a 100644 --- a/src/java.base/share/classes/java/lang/invoke/LambdaProxyClassArchive.java +++ b/src/java.base/share/classes/java/lang/invoke/LambdaProxyClassArchive.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, 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 @@ -102,7 +102,7 @@ final class LambdaProxyClassArchive { Class<?>[] altInterfaces, MethodType[] altMethods) { if (!loadedByBuiltinLoader(caller) || - !CDS.isSharingEnabled() || isSerializable || altInterfaces.length > 0 || altMethods.length > 0) + !CDS.isUsingArchive() || isSerializable || altInterfaces.length > 0 || altMethods.length > 0) return null; return findFromArchive(caller, interfaceMethodName, factoryType, interfaceMethodType, diff --git a/src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java b/src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java index 0191306881b..7d87d4f79a8 100644 --- a/src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java +++ b/src/java.base/share/classes/java/lang/invoke/MethodHandleStatics.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2024, 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 @@ -134,8 +134,8 @@ class MethodHandleStatics { shortenSignature(basicTypeSignature(type)) + (resolvedMember != null ? " (success)" : " (fail)")); } - if (CDS.isDumpingClassList()) { - CDS.traceLambdaFormInvoker("[LF_RESOLVE]", holder.getName(), name, shortenSignature(basicTypeSignature(type))); + if (CDS.isLoggingLambdaFormInvokers()) { + CDS.logLambdaFormInvoker("[LF_RESOLVE]", holder.getName(), name, shortenSignature(basicTypeSignature(type))); } } @@ -148,8 +148,8 @@ class MethodHandleStatics { if (TRACE_RESOLVE) { System.out.println("[SPECIES_RESOLVE] " + cn + (salvage != null ? " (salvaged)" : " (generated)")); } - if (CDS.isDumpingClassList()) { - CDS.traceSpeciesType("[SPECIES_RESOLVE]", cn); + if (CDS.isLoggingLambdaFormInvokers()) { + CDS.logSpeciesType("[SPECIES_RESOLVE]", cn); } } // handy shared exception makers (they simplify the common case code) diff --git a/src/java.base/share/classes/jdk/internal/misc/CDS.java b/src/java.base/share/classes/jdk/internal/misc/CDS.java index e3365441548..ef75326ec58 100644 --- a/src/java.base/share/classes/jdk/internal/misc/CDS.java +++ b/src/java.base/share/classes/jdk/internal/misc/CDS.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, 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 @@ -41,48 +41,42 @@ import java.util.stream.Stream; import jdk.internal.access.SharedSecrets; public class CDS { - private static final boolean isDumpingClassList; - private static final boolean isDumpingArchive; - private static final boolean isSharingEnabled; - private static final boolean isDumpingStaticArchive; - static { - isDumpingClassList = isDumpingClassList0(); - isDumpingArchive = isDumpingArchive0(); - isSharingEnabled = isSharingEnabled0(); - isDumpingStaticArchive = isDumpingArchive && !isSharingEnabled; - } + // Must be in sync with cdsConfig.hpp + private static final int IS_DUMPING_ARCHIVE = 1 << 0; + private static final int IS_DUMPING_STATIC_ARCHIVE = 1 << 1; + private static final int IS_LOGGING_LAMBDA_FORM_INVOKERS = 1 << 2; + private static final int IS_USING_ARCHIVE = 1 << 3; + private static final int configStatus = getCDSConfigStatus(); /** - * indicator for dumping class list. - */ - public static boolean isDumpingClassList() { - return isDumpingClassList; + * Should we log the use of lambda form invokers? + */ + public static boolean isLoggingLambdaFormInvokers() { + return (configStatus & IS_LOGGING_LAMBDA_FORM_INVOKERS) != 0; } /** * Is the VM writing to a (static or dynamic) CDS archive. */ public static boolean isDumpingArchive() { - return isDumpingArchive; + return (configStatus & IS_DUMPING_ARCHIVE) != 0; } /** - * Is sharing enabled. + * Is the VM using at least one CDS archive? */ - public static boolean isSharingEnabled() { - return isSharingEnabled; + public static boolean isUsingArchive() { + return (configStatus & IS_USING_ARCHIVE) != 0; } /** * Is dumping static archive. */ public static boolean isDumpingStaticArchive() { - return isDumpingStaticArchive; + return (configStatus & IS_DUMPING_STATIC_ARCHIVE) != 0; } - private static native boolean isDumpingClassList0(); - private static native boolean isDumpingArchive0(); - private static native boolean isSharingEnabled0(); + private static native int getCDSConfigStatus(); private static native void logLambdaFormInvoker(String line); /** @@ -112,8 +106,8 @@ public class CDS { /** * log lambda form invoker holder, name and method type */ - public static void traceLambdaFormInvoker(String prefix, String holder, String name, String type) { - if (isDumpingClassList) { + public static void logLambdaFormInvoker(String prefix, String holder, String name, String type) { + if (isLoggingLambdaFormInvokers()) { logLambdaFormInvoker(prefix + " " + holder + " " + name + " " + type); } } @@ -121,8 +115,8 @@ public class CDS { /** * log species */ - public static void traceSpeciesType(String prefix, String cn) { - if (isDumpingClassList) { + public static void logSpeciesType(String prefix, String cn) { + if (isLoggingLambdaFormInvokers()) { logLambdaFormInvoker(prefix + " " + cn); } } diff --git a/src/java.base/share/native/libjava/CDS.c b/src/java.base/share/native/libjava/CDS.c index 77f0020db38..989b5aa9dbf 100644 --- a/src/java.base/share/native/libjava/CDS.c +++ b/src/java.base/share/native/libjava/CDS.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2024, 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 @@ -44,19 +44,9 @@ Java_jdk_internal_misc_CDS_getRandomSeedForDumping(JNIEnv *env, jclass ignore) { return JVM_GetRandomSeedForDumping(); } -JNIEXPORT jboolean JNICALL -Java_jdk_internal_misc_CDS_isDumpingArchive0(JNIEnv *env, jclass jcls) { - return JVM_IsCDSDumpingEnabled(env); -} - -JNIEXPORT jboolean JNICALL -Java_jdk_internal_misc_CDS_isSharingEnabled0(JNIEnv *env, jclass jcls) { - return JVM_IsSharingEnabled(env); -} - -JNIEXPORT jboolean JNICALL -Java_jdk_internal_misc_CDS_isDumpingClassList0(JNIEnv *env, jclass jcls) { - return JVM_IsDumpingClassList(env); +JNIEXPORT jint JNICALL +Java_jdk_internal_misc_CDS_getCDSConfigStatus(JNIEnv *env, jclass jcls) { + return JVM_GetCDSConfigStatus(); } JNIEXPORT void JNICALL |